diff --git a/app/lib/screens/study/report/sections/average_section_widget.dart b/app/lib/screens/study/report/sections/average_section_widget.dart index 68907d622..734e3da78 100644 --- a/app/lib/screens/study/report/sections/average_section_widget.dart +++ b/app/lib/screens/study/report/sections/average_section_widget.dart @@ -186,10 +186,13 @@ class AverageSectionWidget extends ReportSectionWidget { showTitles: true, getTitlesWidget: getTitles, )), + // ignore: prefer_const_constructors topTitles: AxisTitles( + // ignore: prefer_const_constructors sideTitles: SideTitles( showTitles: false, ))), + // ignore: prefer_const_constructors gridData: charts.FlGridData( drawHorizontalLine: false, drawVerticalLine: false, diff --git a/app/pubspec.lock b/app/pubspec.lock index 5e5dee3a3..4614cb7d9 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -373,14 +373,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.10.2" - freezed_annotation: - dependency: transitive - description: - name: freezed_annotation - sha256: "70776c4541e5cacfe45bcaf00fe79137b8c61aa34fb5765a05ce6c57fd72c6e9" - url: "https://pub.dev" - source: hosted - version: "0.14.3" functions_client: dependency: transitive description: diff --git a/core/lib/src/models/models.dart b/core/lib/src/models/models.dart index 436575dfa..dd2bde896 100644 --- a/core/lib/src/models/models.dart +++ b/core/lib/src/models/models.dart @@ -17,4 +17,5 @@ export 'tables/study.dart'; export 'tables/study_invite.dart'; export 'tables/study_subject.dart'; export 'tables/subject_progress.dart'; +export 'tables/user.dart'; export 'tasks/tasks.dart'; diff --git a/core/lib/src/models/tables/repo.dart b/core/lib/src/models/tables/repo.dart index 53fca3ff9..0d108b5be 100644 --- a/core/lib/src/models/tables/repo.dart +++ b/core/lib/src/models/tables/repo.dart @@ -22,9 +22,9 @@ class Repo extends SupabaseObjectFunctions { String studyId; GitProvider provider; @JsonKey(name: 'web_url') - String webUrl; + String? webUrl; @JsonKey(name: 'git_url') - String gitUrl; + String? gitUrl; Repo(this.projectId, this.userId, this.studyId, this.provider, this.webUrl, this.gitUrl); diff --git a/core/lib/src/models/tables/repo.g.dart b/core/lib/src/models/tables/repo.g.dart index a22d5e4a9..1f653769c 100644 --- a/core/lib/src/models/tables/repo.g.dart +++ b/core/lib/src/models/tables/repo.g.dart @@ -11,18 +11,28 @@ Repo _$RepoFromJson(Map json) => Repo( json['user_id'] as String, json['study_id'] as String, $enumDecode(_$GitProviderEnumMap, json['provider']), - json['web_url'] as String, - json['git_url'] as String, + json['web_url'] as String?, + json['git_url'] as String?, ); -Map _$RepoToJson(Repo instance) => { - 'project_id': instance.projectId, - 'user_id': instance.userId, - 'study_id': instance.studyId, - 'provider': _$GitProviderEnumMap[instance.provider]!, - 'web_url': instance.webUrl, - 'git_url': instance.gitUrl, - }; +Map _$RepoToJson(Repo instance) { + final val = { + 'project_id': instance.projectId, + 'user_id': instance.userId, + 'study_id': instance.studyId, + 'provider': _$GitProviderEnumMap[instance.provider]!, + }; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull('web_url', instance.webUrl); + writeNotNull('git_url', instance.gitUrl); + return val; +} const _$GitProviderEnumMap = { GitProvider.gitlab: 'gitlab', diff --git a/core/lib/src/models/tables/study.dart b/core/lib/src/models/tables/study.dart index 520e53f02..a3e5aa34f 100644 --- a/core/lib/src/models/tables/study.dart +++ b/core/lib/src/models/tables/study.dart @@ -35,7 +35,7 @@ enum ResultSharing { } @JsonSerializable() -class Study extends SupabaseObjectFunctions { +class Study extends SupabaseObjectFunctions implements Comparable { static const String tableName = 'study'; @override @@ -99,18 +99,22 @@ class Study extends SupabaseObjectFunctions { factory Study.fromJson(Map json) { final study = _$StudyFromJson(json); + final List? repo = json['repo'] as List?; if (repo != null && repo.isNotEmpty) { study.repo = Repo.fromJson((json['repo'] as List)[0] as Map); } + final List? invites = json['study_invite'] as List?; if (invites != null) { study.invites = invites.map((json) => StudyInvite.fromJson(json as Map)).toList(); } + final List? participants = json['study_subject'] as List?; if (participants != null) { study.participants = participants.map((json) => StudySubject.fromJson(json as Map)).toList(); } + List? participantsProgress = json['study_progress'] as List?; participantsProgress = json['study_progress_export'] as List?; participantsProgress ??= json['subject_progress'] as List?; @@ -118,26 +122,32 @@ class Study extends SupabaseObjectFunctions { study.participantsProgress = participantsProgress.map((json) => SubjectProgress.fromJson(json as Map)).toList(); } + final int? participantCount = json['study_participant_count'] as int?; if (participantCount != null) { study.participantCount = participantCount; } + final int? endedCount = json['study_ended_count'] as int?; if (endedCount != null) { study.endedCount = endedCount; } + final int? activeSubjectCount = json['active_subject_count'] as int?; if (activeSubjectCount != null) { study.activeSubjectCount = activeSubjectCount; } + final List? missedDays = json['study_missed_days'] as List?; if (missedDays != null) { study.missedDays = List.from(json['study_missed_days'] as List); } + final String? createdAt = json['created_at'] as String?; if (createdAt != null && createdAt.isNotEmpty) { study.createdAt = DateTime.parse(createdAt); } + return study; } @@ -236,4 +246,9 @@ class Study extends SupabaseObjectFunctions { String toString() { return 'Study{id: $id, title: $title, description: $description, userId: $userId, participation: $participation, resultSharing: $resultSharing, contact: $contact, iconName: $iconName, published: $published, questionnaire: $questionnaire, eligibilityCriteria: $eligibilityCriteria, consent: $consent, interventions: $interventions, observations: $observations, schedule: $schedule, reportSpecification: $reportSpecification, results: $results, collaboratorEmails: $collaboratorEmails, registryPublished: $registryPublished, participantCount: $participantCount, endedCount: $endedCount, activeSubjectCount: $activeSubjectCount, missedDays: $missedDays, repo: $repo, invites: $invites, participants: $participants, participantsProgress: $participantsProgress, createdAt: $createdAt}'; } + + @override + int compareTo(Study other) { + return id.compareTo(other.id); + } } diff --git a/core/lib/src/models/tables/user.dart b/core/lib/src/models/tables/user.dart new file mode 100644 index 000000000..f7d81a743 --- /dev/null +++ b/core/lib/src/models/tables/user.dart @@ -0,0 +1,51 @@ +import 'package:json_annotation/json_annotation.dart'; + +import 'package:studyu_core/core.dart'; + +part 'user.g.dart'; + +@JsonSerializable() +class StudyUUser extends SupabaseObjectFunctions { + static const String tableName = 'user'; + + @override + Map get primaryKeys => {'id': id}; + + @JsonKey(name: 'id') + String id; + @JsonKey(name: 'email') + String email; + @JsonKey(name: 'preferences') + Preferences preferences; + + StudyUUser({required this.id, required this.email, Preferences? preferences}) + : preferences = preferences ?? Preferences(); + + factory StudyUUser.fromJson(Map json) => _$StudyUUserFromJson(json); + + @override + Map toJson() => _$StudyUUserToJson(this); +} + +@JsonSerializable() +class Preferences { + // todo store preferred user language in database + @JsonKey(name: 'lang') + String language; + + @JsonKey(name: 'pinned_studies') + Set pinnedStudies; + + Preferences({this.language = '', this.pinnedStudies = const {}}); + + factory Preferences.fromJson(Map json) => _$PreferencesFromJson(json); + + Map toJson() { + final Map json = _$PreferencesToJson(this); + // Remove empty fields from the JSON map + json.removeWhere( + (key, value) => value == null || value is String && value.isEmpty || value is Set && value.isEmpty, + ); + return json; + } +} diff --git a/core/lib/src/models/tables/user.g.dart b/core/lib/src/models/tables/user.g.dart new file mode 100644 index 000000000..fe2299aa4 --- /dev/null +++ b/core/lib/src/models/tables/user.g.dart @@ -0,0 +1,36 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'user.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +StudyUUser _$StudyUUserFromJson(Map json) => StudyUUser( + id: json['id'] as String, + email: json['email'] as String, + preferences: json['preferences'] == null + ? null + : Preferences.fromJson(json['preferences'] as Map), + ); + +Map _$StudyUUserToJson(StudyUUser instance) => + { + 'id': instance.id, + 'email': instance.email, + 'preferences': instance.preferences.toJson(), + }; + +Preferences _$PreferencesFromJson(Map json) => Preferences( + language: json['lang'] as String? ?? '', + pinnedStudies: (json['pinned_studies'] as List?) + ?.map((e) => e as String) + .toSet() ?? + const {}, + ); + +Map _$PreferencesToJson(Preferences instance) => + { + 'lang': instance.language, + 'pinned_studies': instance.pinnedStudies.toList(), + }; diff --git a/core/lib/src/util/supabase_object.dart b/core/lib/src/util/supabase_object.dart index 525b75d27..e67a66125 100644 --- a/core/lib/src/util/supabase_object.dart +++ b/core/lib/src/util/supabase_object.dart @@ -1,13 +1,7 @@ import 'dart:io'; +import 'package:studyu_core/core.dart'; import 'package:studyu_core/src/env/env.dart' as env; -import 'package:studyu_core/src/models/tables/app_config.dart'; -import 'package:studyu_core/src/models/tables/repo.dart'; -import 'package:studyu_core/src/models/tables/study.dart'; -import 'package:studyu_core/src/models/tables/study_invite.dart'; -import 'package:studyu_core/src/models/tables/study_subject.dart'; -import 'package:studyu_core/src/models/tables/subject_progress.dart'; -import 'package:studyu_core/src/util/analytics.dart'; import 'package:supabase/supabase.dart'; abstract class SupabaseObject { @@ -30,6 +24,8 @@ String tableName(Type cls) { return Repo.tableName; case StudyInvite: return StudyInvite.tableName; + case StudyUUser: + return StudyUUser.tableName; default: print('$cls is not a supported Supabase type'); throw TypeError(); @@ -51,6 +47,8 @@ abstract class SupabaseObjectFunctions implements Supa return Repo.fromJson(json) as T; case StudyInvite: return StudyInvite.fromJson(json) as T; + case StudyUUser: + return StudyUUser.fromJson(json) as T; default: print('$T is not a supported Supabase type'); throw TypeError(); diff --git a/database/migration/migrate-user_preferences.sql b/database/migration/migrate-user_preferences.sql new file mode 100644 index 000000000..7cffb765d --- /dev/null +++ b/database/migration/migrate-user_preferences.sql @@ -0,0 +1,12 @@ +ALTER TABLE public."user" ADD COLUMN preferences jsonb; + + +-- +-- Name: Allow users to manage their own user; Type: POLICY; Schema: public; Owner: supabase_admin +-- + +CREATE POLICY "Allow users to manage their own user" +ON public."user" FOR ALL +USING ( + auth.uid() = id +); diff --git a/database/studyu-schema.sql b/database/studyu-schema.sql index a6d1e4a83..b753c7445 100644 --- a/database/studyu-schema.sql +++ b/database/studyu-schema.sql @@ -73,7 +73,7 @@ SET default_table_access_method = heap; -- CREATE TABLE public.study ( - id uuid DEFAULT gen_random_uuid() NOT NULL, + id uuid DEFAULT gen_random_uuid() NOT NULL UNIQUE, contact jsonb NOT NULL, title text NOT NULL, description text NOT NULL, @@ -580,7 +580,8 @@ ALTER TABLE public.study_progress_export OWNER TO postgres; CREATE TABLE public."user" ( id uuid NOT NULL, - email text + email text, + preferences jsonb ); @@ -831,6 +832,16 @@ CREATE POLICY "Users can do everything with their progress" ON public.subject_pr WHERE (study_subject.id = subject_progress.subject_id)))); +-- +-- Name: Allow users to manage their own user; Type: POLICY; Schema: public; Owner: +-- + +CREATE POLICY "Allow users to manage their own user" +ON public."user" FOR ALL +USING ( + auth.uid() = id +); + -- -- Name: app_config; Type: ROW SECURITY; Schema: public; Owner: postgres -- diff --git a/designer_v2/lib/common_views/search.dart b/designer_v2/lib/common_views/search.dart new file mode 100644 index 000000000..09eea803a --- /dev/null +++ b/designer_v2/lib/common_views/search.dart @@ -0,0 +1,72 @@ +import 'package:flutter/material.dart'; + +class Search extends StatefulWidget { + final Function(String) onQueryChanged; + final SearchController? searchController; + final String? hintText; + final String? initialText; + + const Search({ + super.key, + required this.onQueryChanged, + this.searchController, + this.hintText, + this.initialText, + }); + + @override + SearchState createState() => SearchState(); +} + +class SearchState extends State { + late TextEditingController _searchController; + + @override + void initState() { + super.initState(); + widget.searchController?.setText = setText; + _searchController = TextEditingController(text: widget.initialText); + _searchController.addListener(_onSearchPressed); + } + + @override + void didUpdateWidget(Search oldWidget) { + super.didUpdateWidget(oldWidget); + } + + void _onSearchPressed() { + String query = _searchController.text.toLowerCase(); + widget.onQueryChanged(query); + } + + void setText(String text) { + setState(() { + _searchController.text = text; + }); + } + + @override + Widget build(BuildContext context) { + return SizedBox( + width: 400.0, + child: SearchBar( + hintText: widget.hintText ?? "Search", + controller: _searchController, + leading: const Icon(Icons.search), + shadowColor: MaterialStateProperty.resolveWith((states) { + return Colors.transparent; + }), + )); + } + + @override + void dispose() { + super.dispose(); + _searchController.removeListener(_onSearchPressed); + _searchController.dispose(); + } +} + +class SearchController { + late void Function(String text) setText; +} diff --git a/designer_v2/lib/common_views/standard_table.dart b/designer_v2/lib/common_views/standard_table.dart index 631830c98..f3a7ee6c1 100644 --- a/designer_v2/lib/common_views/standard_table.dart +++ b/designer_v2/lib/common_views/standard_table.dart @@ -1,4 +1,6 @@ +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; +import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; import 'package:studyu_designer_v2/common_views/action_inline_menu.dart'; import 'package:studyu_designer_v2/common_views/action_menu.dart'; import 'package:studyu_designer_v2/common_views/action_popup_menu.dart'; @@ -18,62 +20,75 @@ enum StandardTableStyle { plain, material } /// Default descriptor for a table column class StandardTableColumn { - const StandardTableColumn({ + StandardTableColumn({ required this.label, this.tooltip, this.columnWidth = const FlexColumnWidth(), + this.sortable = false, }); final String label; final String? tooltip; final TableColumnWidth columnWidth; + final bool sortable; + + bool? sortAscending; + Widget? sortableIcon; } -// ignore: must_be_immutable class StandardTable extends StatefulWidget { - StandardTable( - {required this.items, - required this.columns, - required this.onSelectItem, - required this.buildCellsAt, - this.trailingActionsAt, - this.trailingActionsColumn = const StandardTableColumn( - label: '', columnWidth: MaxColumnWidth(IntrinsicColumnWidth(), FixedColumnWidth(65))), - this.trailingActionsMenuType = ActionMenuType.popup, - this.headerRowBuilder, - this.dataRowBuilder, - this.cellSpacing = 10.0, - this.rowSpacing = 9.0, - this.minRowHeight = 50.0, - this.showTableHeader = true, - this.tableWrapper, - this.leadingWidget, - this.trailingWidget, - this.leadingWidgetSpacing = 12.0, - this.trailingWidgetSpacing = 8.0, - this.emptyWidget, - this.rowStyle = StandardTableStyle.material, - this.disableRowInteractions = false, - this.hideLeadingTrailingWhenEmpty = true, - Key? key}) - : super(key: key) { + StandardTable({ + required this.items, + required List? columns, + required this.onSelectItem, + required this.buildCellsAt, + this.pinnedPredicates, + this.sortColumnPredicates, + this.trailingActionsAt, + StandardTableColumn? trailingActionsColumn, + this.trailingActionsMenuType = ActionMenuType.popup, + this.headerRowBuilder, + this.dataRowBuilder, + this.cellSpacing = 10.0, + this.rowSpacing = 9.0, + this.minRowHeight = 60.0, + this.showTableHeader = true, + this.tableWrapper, + this.leadingWidget, + this.trailingWidget, + this.leadingWidgetSpacing = 12.0, + this.trailingWidgetSpacing = 8.0, + this.emptyWidget, + this.rowStyle = StandardTableStyle.material, + this.disableRowInteractions = false, + this.hideLeadingTrailingWhenEmpty = true, + Key? key, + }) : super(key: key) { + if (trailingActionsColumn == null) { + this.inputTrailingActionsColumn = StandardTableColumn( + label: '', columnWidth: const MaxColumnWidth(IntrinsicColumnWidth(), FixedColumnWidth(65))); + } else { + this.inputTrailingActionsColumn = trailingActionsColumn; + } // Insert trailing column for actions menu if (trailingActionsAt != null) { - columns = [...columns]; // don't modify original reference - columns.add(trailingActionsColumn); + this.inputColumns = [...?columns]; + this.inputColumns.add(this.inputTrailingActionsColumn); } } final List items; - late List columns; + late final List inputColumns; final OnSelectHandler onSelectItem; final ActionsProviderAt? trailingActionsAt; final ActionMenuType? trailingActionsMenuType; final StandardTableCellsBuilder buildCellsAt; + final List? sortColumnPredicates; + final int Function(T a, T b)? pinnedPredicates; final StandardTableRowBuilder? headerRowBuilder; final StandardTableRowBuilder? dataRowBuilder; - final StandardTableColumn trailingActionsColumn; + late final StandardTableColumn inputTrailingActionsColumn; final WidgetDecorator? tableWrapper; @@ -117,6 +132,8 @@ class _StandardTableState extends State> { /// Static helper row for padding late final TableRow paddingRow = _buildPaddingRow(); + List? sortDefaultOrder; + @override void initState() { super.initState(); @@ -151,8 +168,8 @@ class _StandardTableState extends State> { final theme = Theme.of(context); final Map columnWidths = {}; - for (var idx = 0; idx < widget.columns.length; idx++) { - columnWidths[idx] = widget.columns[idx].columnWidth; + for (var idx = 0; idx < widget.inputColumns.length; idx++) { + columnWidths[idx] = widget.inputColumns[idx].columnWidth; } final headerRow = _buildHeaderRow(); @@ -192,10 +209,64 @@ class _StandardTableState extends State> { ], ); } - return tableWidget; } + void _sortColumn(int columnIndex) { + if (!(columnIndex >= 0 && columnIndex < widget.inputColumns.length)) return; + final sortAscending = widget.inputColumns[columnIndex].sortAscending; + + // Save default order to restore later + if (sortDefaultOrder == null || sortDefaultOrder!.length != widget.items.length) { + sortDefaultOrder = List.from(widget.items); + } + + if (sortAscending != null) { + widget.items.sort((a, b) { + return _sortLogic(a, b, columnIndex: columnIndex, sortAscending: sortAscending); + }); + _sortPinnedStudies(widget.items, columnIndex: columnIndex, sortAscending: sortAscending); + } else { + widget.items.clear(); + widget.items.addAll(sortDefaultOrder!); + _sortPinnedStudies(widget.items, columnIndex: columnIndex); + } + _cachedRows.clear(); + } + + void _sortPinnedStudies(List items, {required int columnIndex, bool? sortAscending}) { + // Extract and insert pinned items at the top + if (widget.pinnedPredicates != null) { + items.sort((a, b) { + int ret = widget.pinnedPredicates!(a, b); + // Fallback to default sorting algorithm + return ret == 0 ? _sortLogic(a, b, columnIndex: columnIndex, sortAscending: sortAscending) : ret; + }); + } + } + + int _sortLogic(T a, T b, {required int columnIndex, required bool? sortAscending, bool? useSortPredicate}) { + final sortPredicate = widget.sortColumnPredicates; + if (useSortPredicate != null && useSortPredicate && sortPredicate != null && sortPredicate[columnIndex] != null) { + final int res; + if (sortAscending ?? true) { + res = sortPredicate[columnIndex]!(a, b); + } else { + res = sortPredicate[columnIndex]!(b, a); + } + if (res == 0) { + // Fallback to default sorting algorithm + return _sortLogic(a, b, columnIndex: columnIndex, sortAscending: sortAscending, useSortPredicate: false); + } + return res; + } else if (a is Comparable && b is Comparable) { + // If sortPredicate is not provided, use default comparison logic + return sortAscending ?? true ? Comparable.compare(a, b) : Comparable.compare(b, a); + } else { + return 0; + } + } + List _tableRows(ThemeData theme) { final List rows = []; @@ -226,13 +297,14 @@ class _StandardTableState extends State> { } TableRow _buildPaddingRow() { - TableRow rowSpacer = TableRow(children: widget.columns.map((_) => SizedBox(height: widget.rowSpacing)).toList()); + TableRow rowSpacer = + TableRow(children: widget.inputColumns.map((_) => SizedBox(height: widget.rowSpacing)).toList()); return rowSpacer; } TableRow _buildHeaderRow() { final headerRowBuilder = widget.headerRowBuilder ?? _defaultHeader; - return headerRowBuilder(context, widget.columns); + return headerRowBuilder(context, widget.inputColumns); } TableRow _defaultHeader(BuildContext context, List columns) { @@ -240,27 +312,82 @@ class _StandardTableState extends State> { final List headerCells = []; for (var i = 0; i < columns.length; i++) { - final isLeadingTrailing = i == 0 || i == columns.length - 1; - headerCells.add(Padding( - padding: EdgeInsets.fromLTRB( - (isLeadingTrailing) ? 2 * widget.cellSpacing : widget.cellSpacing, - widget.cellSpacing, - (isLeadingTrailing) ? 2 * widget.cellSpacing : widget.cellSpacing, - widget.cellSpacing), - child: Text( - columns[i].label, - overflow: TextOverflow.visible, - maxLines: 1, - softWrap: false, - style: theme.textTheme.bodySmall!.copyWith( - color: theme.colorScheme.onSurface.withOpacity(0.8), - ), - ))); + final isLeading = i == 0; + final isTrailing = i == columns.length - 1; + headerCells.add(MouseEventsRegion( + builder: (context, state) { + return Padding( + padding: EdgeInsets.fromLTRB( + (isLeading || isTrailing) ? 2 * widget.cellSpacing : widget.cellSpacing, + widget.cellSpacing, + (isLeading || isTrailing) ? 2 * widget.cellSpacing : widget.cellSpacing, + widget.cellSpacing), + child: Row( + children: [ + Text( + columns[i].label, + overflow: TextOverflow.visible, + maxLines: 1, + softWrap: false, + style: theme.textTheme.bodySmall!.copyWith( + color: theme.colorScheme.onSurface.withOpacity(0.8), + ), + ), + widget.inputColumns[i].sortable + ? widget.inputColumns[i].sortableIcon ?? const SizedBox(width: 17) + : const SizedBox.shrink(), + ], + )); + }, + onEnter: (event) => setState(() => sortAction(i, hover: event)), + onExit: (event) => setState(() => sortAction(i, hover: event)), + onTap: () => setState(() => sortAction(i)), + )); } - return TableRow(children: headerCells); } + void sortAction(int i, {PointerEvent? hover}) { + if (!widget.inputColumns[i].sortable) return; + + final ascendingIcon = Icon(MdiIcons.arrowUp); + final descendingIcon = Icon(MdiIcons.arrowDown); + final hoveredIcon = Icon(MdiIcons.arrowUp, color: Colors.grey); + + setState(() { + // Clicked + if (hover == null) { + switch (widget.inputColumns[i].sortAscending) { + case null: + // Reset all column sorting + for (StandardTableColumn c in widget.inputColumns) { + c.sortAscending = null; + c.sortableIcon = null; + } + widget.inputColumns[i].sortAscending = true; + widget.inputColumns[i].sortableIcon = ascendingIcon; + break; + case true: + widget.inputColumns[i].sortAscending = false; + widget.inputColumns[i].sortableIcon = descendingIcon; + break; + case false: + widget.inputColumns[i].sortAscending = null; + widget.inputColumns[i].sortableIcon = null; + break; + } + _sortColumn(i); + // No sorting icon is active or hovered + } else if (widget.inputColumns[i].sortAscending == null) { + if (hover is PointerEnterEvent) { + widget.inputColumns[i].sortableIcon = hoveredIcon; + } else if (hover is PointerExitEvent) { + widget.inputColumns[i].sortableIcon = null; + } + } + }); + } + TableRow _buildDataRow(int rowIdx) { final item = widget.items[rowIdx]; final dataRowBuilder = widget.dataRowBuilder ?? _defaultDataRow; @@ -346,7 +473,7 @@ class _StandardTableState extends State> { final isTrailing = i == rawCells.length - 1; //final disableOnTap = (widget.trailingActionsAt != null && isTrailing) // ? true : false; - final cellColumnConfig = widget.columns[i]; + final cellColumnConfig = widget.inputColumns[i]; Widget cell = rawCells[i]; cell = decorateCell( diff --git a/designer_v2/lib/domain/study.dart b/designer_v2/lib/domain/study.dart index 7a5bec2a0..9edfb23bb 100644 --- a/designer_v2/lib/domain/study.dart +++ b/designer_v2/lib/domain/study.dart @@ -6,6 +6,8 @@ import 'package:studyu_designer_v2/utils/extensions.dart'; import 'package:supabase_flutter/supabase_flutter.dart' as sb; enum StudyActionType { + pin, + pinoff, edit, duplicate, duplicateDraft, @@ -18,6 +20,10 @@ enum StudyActionType { extension StudyActionTypeFormatted on StudyActionType { String get string { switch (this) { + case StudyActionType.pin: + return tr.action_pin; + case StudyActionType.pinoff: + return tr.action_unpin; case StudyActionType.edit: return tr.action_edit; case StudyActionType.delete: @@ -27,7 +33,7 @@ extension StudyActionTypeFormatted on StudyActionType { case StudyActionType.duplicateDraft: return tr.action_study_duplicate_draft; case StudyActionType.addCollaborator: - return "[StudyActionType.addCollaborator]"; // not implemented yet + return "[StudyActionType.addCollaborator]"; // todo not implemented yet case StudyActionType.export: return tr.action_study_export_results; default: diff --git a/designer_v2/lib/features/app.dart b/designer_v2/lib/features/app.dart index e2e9b49d0..efe96c992 100644 --- a/designer_v2/lib/features/app.dart +++ b/designer_v2/lib/features/app.dart @@ -78,6 +78,7 @@ class _AppContentState extends ConsumerState { final themeProvider = ThemeProvider.of(context); final theme = themeProvider.light(settings.value.sourceColor); return MaterialApp.router( + title: 'StudyU Designer'.hardcoded, scaffoldMessengerKey: scaffoldMessengerKey, builder: (context, widget) => NotificationDispatcher( scaffoldMessengerKey: scaffoldMessengerKey, @@ -85,7 +86,6 @@ class _AppContentState extends ConsumerState { child: widget, ), debugShowCheckedModeBanner: Config.isDebugMode, - title: 'StudyU Designer V2'.hardcoded, color: theme.colorScheme.surface, theme: theme, routeInformationProvider: router.routeInformationProvider, diff --git a/designer_v2/lib/features/auth/auth_scaffold.dart b/designer_v2/lib/features/auth/auth_scaffold.dart index 2cab90fcf..4d0fb8178 100644 --- a/designer_v2/lib/features/auth/auth_scaffold.dart +++ b/designer_v2/lib/features/auth/auth_scaffold.dart @@ -112,7 +112,7 @@ class _AuthScaffoldState extends ConsumerState { crossAxisAlignment: CrossAxisAlignment.center, children: [ SelectableText( - "© HPI Digital Health Cluster 2023", + "© HPI Digital Health Cluster ${DateTime.now().year}", style: ThemeConfig.bodyTextBackground(theme), ), Row( diff --git a/designer_v2/lib/features/dashboard/dashboard_controller.dart b/designer_v2/lib/features/dashboard/dashboard_controller.dart index a09cf63f9..479ff56b8 100644 --- a/designer_v2/lib/features/dashboard/dashboard_controller.dart +++ b/designer_v2/lib/features/dashboard/dashboard_controller.dart @@ -1,13 +1,15 @@ import 'dart:async'; - import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:studyu_core/core.dart'; +import 'package:studyu_designer_v2/common_views/search.dart'; +import 'package:studyu_designer_v2/domain/study.dart'; import 'package:studyu_designer_v2/features/dashboard/studies_filter.dart'; import 'package:studyu_designer_v2/features/study/study_actions.dart'; import 'package:studyu_designer_v2/repositories/auth_repository.dart'; import 'package:studyu_designer_v2/repositories/model_repository.dart'; import 'package:studyu_designer_v2/repositories/study_repository.dart'; +import 'package:studyu_designer_v2/repositories/user_repository.dart'; import 'package:studyu_designer_v2/routing/router.dart'; import 'package:studyu_designer_v2/routing/router_intent.dart'; import 'package:studyu_designer_v2/utils/model_action.dart'; @@ -18,16 +20,20 @@ class DashboardController extends StateNotifier implements IMode /// References to the data repositories injected by Riverpod final IStudyRepository studyRepository; final IAuthRepository authRepository; + final IUserRepository userRepository; /// Reference to services injected via Riverpod final GoRouter router; - /// A subscription for synchronizing state between the repository & controller + /// A subscription for synchronizing state between the repository and the controller StreamSubscription>>? _studiesSubscription; + final SearchController searchController = SearchController(); + DashboardController({ required this.studyRepository, required this.authRepository, + required this.userRepository, required this.router, }) : super(DashboardState(currentUser: authRepository.currentUser!)) { _subscribeStudies(); @@ -48,6 +54,10 @@ class DashboardController extends StateNotifier implements IMode }); } + setSearchText(String? text) { + searchController.setText(text ?? state.query); + } + setStudiesFilter(StudiesFilter? filter) { state = state.copyWith(studiesFilter: () => filter ?? DashboardState.defaultFilter); } @@ -60,10 +70,56 @@ class DashboardController extends StateNotifier implements IMode router.dispatch(RoutingIntents.studyNew); } + Future pinStudy(String modelId) async { + await userRepository.updatePreferences(PreferenceAction.pin, modelId); + sortStudies(); + } + + Future pinOffStudy(String modelId) async { + await userRepository.updatePreferences(PreferenceAction.pinOff, modelId); + sortStudies(); + } + + void filterStudies(String? query) async { + state = state.copyWith( + query: query, + ); + } + + void sortStudies() async { + final studies = state.sort(pinnedStudies: userRepository.user.preferences.pinnedStudies); + state = state.copyWith( + studies: () => AsyncValue.data(studies), + ); + } + + bool isPinned(Study study) { + return userRepository.user.preferences.pinnedStudies.contains(study.id); + } + @override List availableActions(Study model) { + final pinActions = [ + ModelAction( + type: StudyActionType.pin, + label: StudyActionType.pin.string, + onExecute: () async { + await pinStudy(model.id); + }, + isAvailable: !isPinned(model), + ), + ModelAction( + type: StudyActionType.pinoff, + label: StudyActionType.pinoff.string, + onExecute: () async { + await pinOffStudy(model.id); + }, + isAvailable: isPinned(model), + ) + ].where((action) => action.isAvailable).toList(); + return withIcons( - studyRepository.availableActions(model), + [...pinActions, ...studyRepository.availableActions(model)], studyActionIcons, ); } @@ -79,6 +135,7 @@ final dashboardControllerProvider = StateNotifierProvider.autoDispose { late final DashboardController controller; + late final DashboardState state; @override void initState() { super.initState(); controller = ref.read(dashboardControllerProvider.notifier); + state = ref.read(dashboardControllerProvider); runAsync(() => controller.setStudiesFilter(widget.filter)); } @@ -44,6 +48,7 @@ class _DashboardScreenState extends ConsumerState { final theme = Theme.of(context); final controller = ref.read(dashboardControllerProvider.notifier); final state = ref.watch(dashboardControllerProvider); + final userRepo = ref.watch(userRepositoryProvider); return DashboardScaffold( body: Column( @@ -59,34 +64,51 @@ class _DashboardScreenState extends ConsumerState { ), const SizedBox(width: 28.0), SelectableText(state.visibleListTitle, style: theme.textTheme.headlineMedium), + const Spacer(), + Search( + searchController: controller.searchController, + hintText: tr.search, + onQueryChanged: (query) => controller.filterStudies(query)), ], ), const SizedBox(height: 24.0), // spacing between body elements - AsyncValueWidget>( - value: state.visibleStudies, - data: (visibleStudies) => StudiesTable( - studies: visibleStudies, - onSelect: controller.onSelectStudy, - getActions: controller.availableActions, - emptyWidget: (widget.filter == null || widget.filter == StudiesFilter.owned) - ? Padding( - padding: const EdgeInsets.only(top: 24.0), - child: EmptyBody( - icon: Icons.content_paste_search_rounded, - title: "You don't have any studies yet", - description: - "Build your own study from scratch, start from the default template or create a new draft copy from an already published study!", - button: PrimaryButton( - text: "From template", - onPressed: () { - print("TODO"); - }, - ), - ), - ) - : const SizedBox.shrink(), - ), - ) + FutureBuilder( + future: userRepo.fetchUser(), // todo cache this with ModelRepository + builder: (context, snapshot) { + if (snapshot.hasData) { + return AsyncValueWidget>( + value: state.visibleStudies(snapshot.data!.preferences.pinnedStudies, state.query), + data: (visibleStudies) => StudiesTable( + studies: visibleStudies, + pinnedStudies: snapshot.data!.preferences.pinnedStudies, + dashboardController: ref.read(dashboardControllerProvider.notifier), + onSelect: controller.onSelectStudy, + getActions: controller.availableActions, + emptyWidget: (widget.filter == null || widget.filter == StudiesFilter.owned) + ? (state.query.isNotEmpty) + ? Padding( + padding: const EdgeInsets.only(top: 24.0), + child: EmptyBody( + icon: Icons.content_paste_search_rounded, + title: tr.studies_not_found, + description: tr.modify_query, + ), + ) + : Padding( + padding: const EdgeInsets.only(top: 24.0), + child: EmptyBody( + icon: Icons.content_paste_search_rounded, + title: tr.studies_empty, + description: tr.studies_empty_description, + // "...or create a new draft copy from an already published study!", + /* button: PrimaryButton(text: "From template",); */ + ), + ) + : const SizedBox.shrink(), + )); + } + return const SizedBox.shrink(); + }), ], ), ); diff --git a/designer_v2/lib/features/dashboard/dashboard_state.dart b/designer_v2/lib/features/dashboard/dashboard_state.dart index 47d9556ae..ff55681b2 100644 --- a/designer_v2/lib/features/dashboard/dashboard_state.dart +++ b/designer_v2/lib/features/dashboard/dashboard_state.dart @@ -11,6 +11,7 @@ class DashboardState extends Equatable { const DashboardState({ this.studies = const AsyncValue.loading(), this.studiesFilter = defaultFilter, + this.query = '', required this.currentUser, }); @@ -25,33 +26,64 @@ class DashboardState extends Equatable { /// Currently authenticated user (used for filtering studies) final User currentUser; + final String query; + /// The currently visible list of studies as by the selected filter /// /// Wrapped in an [AsyncValue] that mirrors the [studies]' async states, /// but resolves to a different subset of studies based on the [studiesFilter] - AsyncValue> get visibleStudies { + AsyncValue> visibleStudies(Set pinnedStudies, String query) { return studies.when( - data: (studies) => AsyncValue.data(_filterAndSortStudies(studies)), + data: (studies) { + List updatedStudies = studiesFilter.apply(studies: studies, user: currentUser).toList(); + updatedStudies = filter(studiesToFilter: updatedStudies); + updatedStudies = sort(pinnedStudies: pinnedStudies, studiesToSort: updatedStudies); + return AsyncValue.data(updatedStudies); + }, error: (error, _) => AsyncValue.error(error, StackTrace.current), loading: () => const AsyncValue.loading(), ); } - List _filterAndSortStudies(List studies) { - final filteredStudies = studiesFilter.apply(studies: studies, user: currentUser).toList(); - filteredStudies.sort((study, other) => study.title!.compareTo(other.title!)); + List filter({List? studiesToFilter}) { + final filteredStudies = studiesToFilter ?? studies.value!; + if (query.isNotEmpty) { + return filteredStudies.where((s) => s.title!.toLowerCase().contains(query)).toList(); + } return filteredStudies; } + List sort({required Set pinnedStudies, List? studiesToSort}) { + final sortedStudies = studiesToSort ?? studies.value!; + sortedStudies.sort((study, other) => study.title!.compareTo(other.title!)); + if (pinnedStudies.isNotEmpty) { + // Extract pinned studies and remove them from filteredStudies + final List pinned = []; + sortedStudies.removeWhere((study) { + if (pinnedStudies.contains(study.id)) { + pinned.add(study); + return true; + } + return false; + }); + + // Insert pinned studies at the beginning of the filteredStudies list + sortedStudies.insertAll(0, pinned); + } + return sortedStudies; + } + DashboardState copyWith({ AsyncValue> Function()? studies, StudiesFilter Function()? studiesFilter, User Function()? currentUser, + String? query, }) { return DashboardState( studies: studies != null ? studies() : this.studies, studiesFilter: studiesFilter != null ? studiesFilter() : this.studiesFilter, currentUser: currentUser != null ? currentUser() : this.currentUser, + query: query ?? this.query, ); } diff --git a/designer_v2/lib/features/dashboard/studies_table.dart b/designer_v2/lib/features/dashboard/studies_table.dart index cdd40fe85..5032fcb7a 100644 --- a/designer_v2/lib/features/dashboard/studies_table.dart +++ b/designer_v2/lib/features/dashboard/studies_table.dart @@ -1,7 +1,10 @@ import 'package:flutter/material.dart'; +import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; import 'package:studyu_core/core.dart'; import 'package:studyu_designer_v2/common_views/action_popup_menu.dart'; +import 'package:studyu_designer_v2/common_views/mouse_events.dart'; import 'package:studyu_designer_v2/common_views/standard_table.dart'; +import 'package:studyu_designer_v2/features/dashboard/dashboard_controller.dart'; import 'package:studyu_designer_v2/localization/app_translation.dart'; import 'package:studyu_designer_v2/theme.dart'; import 'package:studyu_designer_v2/utils/extensions.dart'; @@ -14,6 +17,8 @@ class StudiesTable extends StatelessWidget { required this.onSelect, required this.getActions, required this.emptyWidget, + required this.pinnedStudies, + required this.dashboardController, Key? key, }) : super(key: key); @@ -21,45 +26,96 @@ class StudiesTable extends StatelessWidget { final OnSelectHandler onSelect; final ActionsProviderFor getActions; final Widget emptyWidget; + final Iterable pinnedStudies; + final DashboardController dashboardController; @override Widget build(BuildContext context) { + List headers = [ + tr.studies_list_header_participants_enrolled, + tr.studies_list_header_participants_active, + tr.studies_list_header_participants_completed, + ]; + final int maxLength = headers.fold(0, (max, element) => max > element.length ? max : element.length); + final double statsCellWidth = maxLength * 11; + return StandardTable( items: studies, columns: [ StandardTableColumn( - label: tr.studies_list_header_title, - columnWidth: const MaxColumnWidth(FixedColumnWidth(200), FlexColumnWidth(2.4))), + label: '', + columnWidth: const FixedColumnWidth(60), + ), StandardTableColumn( - label: tr.studies_list_header_status, - columnWidth: const MaxColumnWidth(FixedColumnWidth(90), IntrinsicColumnWidth())), + label: tr.studies_list_header_title, + columnWidth: const MaxColumnWidth(FixedColumnWidth(200), FlexColumnWidth(2.4)), + sortable: true, + ), StandardTableColumn( - label: tr.studies_list_header_participation, - columnWidth: const MaxColumnWidth(FixedColumnWidth(130), IntrinsicColumnWidth())), + label: tr.studies_list_header_status, + columnWidth: const MaxColumnWidth(FixedColumnWidth(90), IntrinsicColumnWidth()), + sortable: true, + ), + StandardTableColumn( + label: tr.studies_list_header_participation, + columnWidth: const MaxColumnWidth(FixedColumnWidth(130), IntrinsicColumnWidth()), + sortable: true, + ), StandardTableColumn( label: tr.studies_list_header_created_at, columnWidth: const FlexColumnWidth(1), + sortable: true, ), StandardTableColumn( label: tr.studies_list_header_participants_enrolled, - columnWidth: const FlexColumnWidth(0.5), + columnWidth: MaxColumnWidth(FixedColumnWidth(statsCellWidth), const IntrinsicColumnWidth()), + sortable: true, ), StandardTableColumn( label: tr.studies_list_header_participants_active, - columnWidth: const FlexColumnWidth(0.5), + columnWidth: MaxColumnWidth(FixedColumnWidth(statsCellWidth), const IntrinsicColumnWidth()), + sortable: true, ), StandardTableColumn( label: tr.studies_list_header_participants_completed, - columnWidth: const FlexColumnWidth(0.5), + columnWidth: MaxColumnWidth(FixedColumnWidth(statsCellWidth), const IntrinsicColumnWidth()), + sortable: true, ), ], onSelectItem: onSelect, trailingActionsAt: (item, _) => getActions(item), buildCellsAt: _buildRow, + sortColumnPredicates: _sortColumns, + pinnedPredicates: pinnedPredicates, emptyWidget: emptyWidget, ); } + int Function(Study a, Study b) get pinnedPredicates { + return (Study a, Study b) { + if (pinnedStudies.contains(a.id)) { + return -1; + } else if (pinnedStudies.contains(b.id)) { + return 1; + } + return 0; + }; + } + + List get _sortColumns { + final predicates = [ + (Study a, Study b) => 0, // do not sort pin icon + (Study a, Study b) => a.title!.compareTo(b.title!), + (Study a, Study b) => a.status.index.compareTo(b.status.index), + (Study a, Study b) => a.participation.index.compareTo(b.participation.index), + (Study a, Study b) => a.createdAt!.compareTo(b.createdAt!), + (Study a, Study b) => a.participantCount.compareTo(b.participantCount), + (Study a, Study b) => a.activeSubjectCount.compareTo(b.activeSubjectCount), + (Study a, Study b) => a.endedCount.compareTo(b.endedCount), + ]; + return predicates; + } + List _buildRow(BuildContext context, Study item, int rowIdx, Set states) { final theme = Theme.of(context); @@ -67,7 +123,37 @@ class StudiesTable extends StatelessWidget { return (value > 0) ? null : ThemeConfig.bodyTextBackground(theme); } + Icon icon(IconData iconData) { + return Icon( + iconData, + color: Colors.grey, + size: 25, + ); + } + + Widget getRespectivePinIcon(Set state) { + final bool contains = pinnedStudies.contains(item.id); + final bool hovers = state.contains(MaterialState.hovered); + if (hovers) { + return contains ? icon(MdiIcons.pinOff) : icon(MdiIcons.pin); + } else { + return contains ? icon(MdiIcons.pin) : const SizedBox.shrink(); + } + } + return [ + MouseEventsRegion( + onTap: () => pinnedStudies.contains(item.id) + ? dashboardController.pinOffStudy(item.id) + : dashboardController.pinStudy(item.id), + builder: (context, mouseEventState) { + return SizedBox.expand( + child: Container( + child: getRespectivePinIcon(mouseEventState), + ), + ); + }, + ), Text(item.title ?? '[Missing study title]'), StudyStatusBadge( status: item.status, diff --git a/designer_v2/lib/features/design/enrollment/screener_question_logic_form_view.dart b/designer_v2/lib/features/design/enrollment/screener_question_logic_form_view.dart index 72e7d4199..93f9f7ceb 100644 --- a/designer_v2/lib/features/design/enrollment/screener_question_logic_form_view.dart +++ b/designer_v2/lib/features/design/enrollment/screener_question_logic_form_view.dart @@ -65,17 +65,17 @@ class ScreenerQuestionLogicFormView extends FormConsumerWidget { builder: (context, formArray, child) { return StandardTable( items: formViewModel.responseOptionsDisabledControls, - columns: const [ + columns: [ StandardTableColumn( label: '', // don't care (showTableHeader=false) - columnWidth: FixedColumnWidth(32.0), + columnWidth: const FixedColumnWidth(32.0), ), StandardTableColumn( label: '', // don't care (showTableHeader=false) - columnWidth: FlexColumnWidth(5)), + columnWidth: const FlexColumnWidth(5)), StandardTableColumn( label: '', // don't care (showTableHeader=false) - columnWidth: FlexColumnWidth(4)), + columnWidth: const FlexColumnWidth(4)), ], onSelectItem: (_) => {}, // no-op buildCellsAt: (context, item, rowIdx, __) { diff --git a/designer_v2/lib/features/design/info/study_info_form_controller.dart b/designer_v2/lib/features/design/info/study_info_form_controller.dart index b66a8f571..3cc081d68 100644 --- a/designer_v2/lib/features/design/info/study_info_form_controller.dart +++ b/designer_v2/lib/features/design/info/study_info_form_controller.dart @@ -101,7 +101,7 @@ class StudyInfoFormViewModel extends FormViewModel { emailRequired, phoneRequired, emailFormat, - websiteFormat + websiteFormat, ], StudyFormValidationSet.test: [titleRequired], }; diff --git a/designer_v2/lib/features/design/shared/questionnaire/question/types/bool_question_form_view.dart b/designer_v2/lib/features/design/shared/questionnaire/question/types/bool_question_form_view.dart index 3c55df5ad..1920c11ef 100644 --- a/designer_v2/lib/features/design/shared/questionnaire/question/types/bool_question_form_view.dart +++ b/designer_v2/lib/features/design/shared/questionnaire/question/types/bool_question_form_view.dart @@ -18,14 +18,14 @@ class BoolQuestionFormView extends ConsumerWidget { opacity: 0.5, child: StandardTable( items: formViewModel.answerOptionsControls, - columns: const [ + columns: [ StandardTableColumn( label: '', // don't care (showTableHeader=false) - columnWidth: FixedColumnWidth(32.0), + columnWidth: const FixedColumnWidth(32.0), ), StandardTableColumn( label: '', // don't care (showTableHeader=false) - columnWidth: FlexColumnWidth()), + columnWidth: const FlexColumnWidth()), ], onSelectItem: (_) => {}, // no-op buildCellsAt: (context, control, _, __) => buildChoiceOptionRow(context, control), diff --git a/designer_v2/lib/features/design/shared/questionnaire/question/types/choice_question_form_view.dart b/designer_v2/lib/features/design/shared/questionnaire/question/types/choice_question_form_view.dart index d2eb54b8d..012b4f788 100644 --- a/designer_v2/lib/features/design/shared/questionnaire/question/types/choice_question_form_view.dart +++ b/designer_v2/lib/features/design/shared/questionnaire/question/types/choice_question_form_view.dart @@ -33,14 +33,14 @@ class ChoiceQuestionFormView extends ConsumerWidget { builder: (context, formArray, child) { return StandardTable( items: formViewModel.answerOptionsControls, - columns: const [ + columns: [ StandardTableColumn( label: '', // don't care (showTableHeader=false) - columnWidth: FixedColumnWidth(32.0), + columnWidth: const FixedColumnWidth(32.0), ), StandardTableColumn( label: '', // don't care (showTableHeader=false) - columnWidth: FlexColumnWidth()), + columnWidth: const FlexColumnWidth()), ], onSelectItem: (_) => {}, // no-op diff --git a/designer_v2/lib/features/design/study_form_controller.dart b/designer_v2/lib/features/design/study_form_controller.dart index f019fbd71..1817a1d02 100644 --- a/designer_v2/lib/features/design/study_form_controller.dart +++ b/designer_v2/lib/features/design/study_form_controller.dart @@ -151,7 +151,7 @@ class StudyFormViewModel extends FormViewModel implements IFormViewModelD Future _applyAndSaveSubform(IStudyFormData subformData) { studyDirtyCopy ??= formData!.exactDuplicate(); subformData.apply(studyDirtyCopy!); - // Flush the on-write study copy to the repository & clear it + // Flush the on-write study copy to the repository and clear it return studyRepository.save(studyDirtyCopy!).then((study) => studyDirtyCopy = null); } } diff --git a/designer_v2/lib/features/forms/form_array_table.dart b/designer_v2/lib/features/forms/form_array_table.dart index 51786cdc9..909c554fd 100644 --- a/designer_v2/lib/features/forms/form_array_table.dart +++ b/designer_v2/lib/features/forms/form_array_table.dart @@ -62,9 +62,9 @@ class FormArrayTable extends StatelessWidget { final bool hideLeadingTrailingWhenEmpty; static final List columns = [ - const StandardTableColumn( + StandardTableColumn( label: '', // don't care (showTableHeader=false) - columnWidth: FlexColumnWidth()), + columnWidth: const FlexColumnWidth()), ]; @override diff --git a/designer_v2/lib/features/recruit/invite_code_form_controller.dart b/designer_v2/lib/features/recruit/invite_code_form_controller.dart index 006e5322a..34ac2d93f 100644 --- a/designer_v2/lib/features/recruit/invite_code_form_controller.dart +++ b/designer_v2/lib/features/recruit/invite_code_form_controller.dart @@ -120,7 +120,7 @@ class InviteCodeFormViewModel extends FormViewModel { /// before the [StudyController]'s [Study] is available (see also: [AsyncValue]) final inviteCodeFormViewModelProvider = Provider.autoDispose.family((ref, studyId) { print("inviteCodeFormViewModelProvider($studyId"); - // Reactively bind to & obtain [StudyController]'s current study + // Reactively bind to and obtain [StudyController]'s current study final study = ref.watch(studyControllerProvider(studyId).select((state) => state.study)); final inviteCodeRepository = ref.watch(inviteCodeRepositoryProvider(studyId)); diff --git a/designer_v2/lib/features/recruit/invite_codes_table.dart b/designer_v2/lib/features/recruit/invite_codes_table.dart index ad3c44144..d83fd3b6b 100644 --- a/designer_v2/lib/features/recruit/invite_codes_table.dart +++ b/designer_v2/lib/features/recruit/invite_codes_table.dart @@ -34,7 +34,7 @@ class StudyInvitesTable extends StatelessWidget { return StandardTable( items: invites, columns: [ - const StandardTableColumn(label: '#', columnWidth: FixedColumnWidth(60)), + StandardTableColumn(label: '#', columnWidth: const FixedColumnWidth(60)), StandardTableColumn( label: tr.code_list_header_code, columnWidth: const MaxColumnWidth(FixedColumnWidth(200), FlexColumnWidth(1.6))), diff --git a/designer_v2/lib/features/study/study_actions.dart b/designer_v2/lib/features/study/study_actions.dart index b391ba328..cbd257fcb 100644 --- a/designer_v2/lib/features/study/study_actions.dart +++ b/designer_v2/lib/features/study/study_actions.dart @@ -1,7 +1,10 @@ import 'package:flutter/material.dart'; +import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; import 'package:studyu_designer_v2/domain/study.dart'; Map studyActionIcons = { + StudyActionType.pin: MdiIcons.pin, + StudyActionType.pinoff: MdiIcons.pinOff, StudyActionType.edit: Icons.edit_rounded, StudyActionType.duplicate: Icons.file_copy_rounded, StudyActionType.duplicateDraft: Icons.file_copy_rounded, diff --git a/designer_v2/lib/localization/app_de.arb b/designer_v2/lib/localization/app_de.arb index abcfb5c78..e3352f49b 100644 --- a/designer_v2/lib/localization/app_de.arb +++ b/designer_v2/lib/localization/app_de.arb @@ -85,6 +85,7 @@ "navlink_logout": "Abmelden", "@__________________DASHBOARD__________________": {}, "action_button_new_study": "Neue Studie", + "search": "Suche", "studies_list_header_title": "Studientitel", "studies_list_header_status": "Status", "studies_list_header_participation": "Teilnahme", @@ -92,6 +93,10 @@ "studies_list_header_participants_enrolled": "Angemeldet", "studies_list_header_participants_active": "Aktiv", "studies_list_header_participants_completed": "Abgeschlossen", + "studies_not_found": "Es konnten keine Studien gefunden werden", + "modify_query": "Verändere deine Suchanfrage, um mehr Studien in die Suche miteinzubeziehen", + "studies_empty": "Du hast noch keine Studien erstellt", + "studies_empty_description": "Erstelle deine eigene Studie von Grund auf oder erstelle einen Entwurf aus einer bereits veröffentlichten Studie", "@__________________STUDYPAGE__________________": {}, "navlink_learn": "Lernen", "navlink_study_design": "Entwerfen", @@ -193,11 +198,16 @@ "form_field_study_title_required": "Die Studie muss einen Titel haben", "form_field_study_title_default": "Unbenannte Studie", "form_field_study_description": "Beschreibung", - "form_field_study_description_tooltip": "Beschreibe die Studie kurz & verständlich für Teilnehmer", - "form_field_study_description_hint": "Beschreibe die Studie kurz & verständlich für Teilnehmer", + "form_field_study_description_tooltip": "Beschreibe die Studie kurz und verständlich für Teilnehmer", + "form_field_study_description_hint": "Beschreibe die Studie kurz und verständlich für Teilnehmer", "form_field_study_description_required": "Die Studie muss eine Beschreibung haben", + "form_field_study_tags": "Schlagwörter", + "form_field_study_tags_hint": "Füge ein Schlagwort hinzu und drücke die Enter Taste", + "form_field_study_tags_tooltip": "Schlagwörter ermöglichen es anderen Wissenschaftlern und Teilnehmern die Studie besser zu finden", + "form_field_study_tags_error_length": "Es dürfen maximal {count} Schlagwörter zu einer Studie hinzugefügt werden", + "form_field_study_tags_helper": "Wähle bis zu {count} Schlagwörter aus, die die Studie beschreiben", "form_field_study_icon_required": "Die Studie muss ein Icon haben", - "form_section_publisher": "Herausgeber & Kontakt", + "form_section_publisher": "Herausgeber und Kontakt", "form_section_publisher_description": "Teilnehmer der Studie können gemäß den hier angegebenen Informationen über die StudyU App mit dir in Kontakt treten. Andere Forscher oder Kliniker können dich nur kontaktieren, wenn die Studie im Studienregister veröffentlicht ist.", "form_field_organization": "Verantwortliche Organisation", "form_field_organization_required": "Die Studie muss eine verantwortliche Organisation haben", @@ -476,6 +486,8 @@ } }, "date_just_now": "Gerade eben", + "action_pin": "Anheften", + "action_unpin": "Nicht mehr anheften", "action_edit": "Bearbeiten", "action_delete": "Löschen", "action_remove": "Entfernen", diff --git a/designer_v2/lib/localization/app_en.arb b/designer_v2/lib/localization/app_en.arb index 339ffbcf1..b26146fdb 100644 --- a/designer_v2/lib/localization/app_en.arb +++ b/designer_v2/lib/localization/app_en.arb @@ -85,6 +85,7 @@ "notification_code_clipboard": "Code copied to clipboard", "@__________________DASHBOARD__________________": {}, "action_button_new_study": "New study", + "search": "Search", "studies_list_header_title": "Title", "studies_list_header_status": "Status", "studies_list_header_participation": "Participation", @@ -92,6 +93,10 @@ "studies_list_header_participants_enrolled": "Enrolled", "studies_list_header_participants_active": "Active", "studies_list_header_participants_completed": "Completed", + "studies_not_found": "No Studies found", + "modify_query": "Modify your query", + "studies_empty": "You don't have any studies yet", + "studies_empty_description": "Build your own study from scratch or create a new draft copy from an already published study!", "@__________________STUDYPAGE__________________": {}, "navlink_learn": "Learn", "navlink_study_design": "Design", @@ -125,7 +130,6 @@ "form_field_question_help_text": "Question help text", "form_field_question_help_text_tooltip": "Enter a text that is shown with a help icon next to the question in the app", "form_field_question_help_text_hint": "Provide additional context, help or instructions for the question", - "form_field_question_help_text_hint": "Provide additional context, help or instructions for the question", "form_field_question_help_text_add": "Add a help text", "form_field_question_help_text_add_tooltip": "Add a text that is shown with a help icon next to the question in the app", "form_field_question_response_options": "Response options", @@ -197,8 +201,13 @@ "form_field_study_description_tooltip": "Give a short summary of your study to participants", "form_field_study_description_hint": "Give a short summary of your study to participants", "form_field_study_description_required": "The study description must not be empty", + "form_field_study_tags": "Tags", + "form_field_study_tags_hint": "Write down a tag and press the Enter key", + "form_field_study_tags_tooltip": "Add tags to your study to make it easier to find for other researchers and clinicians", + "form_field_study_tags_error_length": "You can only add up to {count} tags to your study", + "form_field_study_tags_helper": "Select up to {count} tags from the list or add your own.", "form_field_study_icon_required": "You must select an icon for your study", - "form_section_publisher": "Publisher & Contact Information", + "form_section_publisher": "Publisher and Contact Information", "form_section_publisher_description": "Participants will be able to contact you via the StudyU app using this information. Other clinicians or researchers will only be able to contact you if you agree to publish your study to the study registry.", "form_field_organization": "Responsible organization", "form_field_organization_required": "The responsible organization must not be empty", @@ -354,7 +363,7 @@ "count": {} } }, - "@__________________STUDYPAGE_DESIGN_MEASUREMENTS__________________": {}, + "@__________________STUDYPAGE_DESIGN_REPORTS__________________": {}, "report_status_primary": "Primary", "report_status_secondary": "Secondary", "report_status_primary_description": "Primary Report", @@ -522,6 +531,8 @@ }, "date_just_now": "Just now", "action_edit": "Edit", + "action_pin": "Pin", + "action_unpin": "Remove pin", "action_delete": "Delete", "action_remove": "Remove", "action_duplicate": "Duplicate", diff --git a/designer_v2/lib/repositories/api_client.dart b/designer_v2/lib/repositories/api_client.dart index d9ee8dd86..3c769a7b8 100644 --- a/designer_v2/lib/repositories/api_client.dart +++ b/designer_v2/lib/repositories/api_client.dart @@ -22,6 +22,8 @@ abstract class StudyUApi { Study study, List records); */ Future fetchAppConfig(); + Future fetchUser(String userId); + Future saveUser(StudyUUser user); } typedef SupabaseQueryExceptionHandler = void Function(SupabaseQueryError error); @@ -47,6 +49,8 @@ class ReportSectionNotFoundException extends APIException {} class StudyInviteNotFoundException extends APIException {} +class UserNotFoundException extends APIException {} + class StudyUApiClient extends SupabaseClientDependant with SupabaseQueryMixin implements StudyUApi { StudyUApiClient({ required this.supabaseClient, @@ -64,7 +68,7 @@ class StudyUApiClient extends SupabaseClientDependant with SupabaseQueryMixin im 'study_participant_count', 'study_ended_count', 'active_subject_count', - 'study_missed_days' + 'study_missed_days', ]; static final studyWithParticipantActivityColumns = [ @@ -134,8 +138,8 @@ class StudyUApiClient extends SupabaseClientDependant with SupabaseQueryMixin im @override Future saveStudy(Study study) async { await _testDelay(); - // Chain a fetch request to make sure we return a complete & updated study - final request = study.save(); //.then((study) => fetchStudy(study.id)); + // Chain a fetch request to make sure we return a complete and updated study + final request = study.save().then((study) => fetchStudy(study.id)); return _awaitGuarded(request); } @@ -161,7 +165,7 @@ class StudyUApiClient extends SupabaseClientDependant with SupabaseQueryMixin im await _testDelay(); // Delegate to [SupabaseObjectMethods] final request = invite.delete(); // upsert will override existing record - return _awaitGuarded(request); // TODO: any errors here? + return _awaitGuarded(request); } @override @@ -170,6 +174,23 @@ class StudyUApiClient extends SupabaseClientDependant with SupabaseQueryMixin im return _awaitGuarded(request); } + @override + Future fetchUser(String userId) async { + await _testDelay(); + final request = getById(userId); + return _awaitGuarded(request, onError: { + HttpStatus.notAcceptable: (e) => throw UserNotFoundException(), + HttpStatus.notFound: (e) => throw UserNotFoundException(), + }); + } + + @override + Future saveUser(StudyUUser user) async { + await _testDelay(); + final request = user.save(); + return _awaitGuarded(request); + } + /// Helper that tries to complete the given Supabase query [future] while /// dispatching errors to the registered [onError] handlers. /// @@ -183,10 +204,10 @@ class StudyUApiClient extends SupabaseClientDependant with SupabaseQueryMixin im return result; } on SupabaseQueryError catch (e) { if (onError == null) { - throw _apiException(); + throw _apiException(error: e); } if (e.statusCode == null || !onError.containsKey(e.statusCode)) { - throw _apiException(); + throw _apiException(error: e); } final errorHandler = onError[e.statusCode]!; errorHandler(e); @@ -194,8 +215,15 @@ class StudyUApiClient extends SupabaseClientDependant with SupabaseQueryMixin im throw _apiException(); } - _apiException() { - debugLog("Unknown exception encountered"); + _apiException({SupabaseQueryError? error}) { + if (error != null) { + debugLog("Supabase Exception encountered"); + debugLog(error.statusCode.toString()); + debugLog(error.details); + debugLog(error.message); + } else { + debugLog("Unknown exception encountered"); + } return APIException(); } diff --git a/designer_v2/lib/repositories/model_repository.dart b/designer_v2/lib/repositories/model_repository.dart index 55aa5639a..c2415a57f 100644 --- a/designer_v2/lib/repositories/model_repository.dart +++ b/designer_v2/lib/repositories/model_repository.dart @@ -79,7 +79,9 @@ abstract class IModelRepositoryDelegate { Future> fetchAll(); Future fetch(ModelID modelId); Future save(T model); + // todo saveAll(List models); Future delete(T model); + // todo deleteAll(List models); T createNewInstance(); T createDuplicate(T model); onError(Object error, StackTrace? stackTrace); diff --git a/designer_v2/lib/repositories/study_repository.dart b/designer_v2/lib/repositories/study_repository.dart index 43a4f5f70..c02dbbb9f 100644 --- a/designer_v2/lib/repositories/study_repository.dart +++ b/designer_v2/lib/repositories/study_repository.dart @@ -20,11 +20,12 @@ import 'package:studyu_designer_v2/utils/performance.dart'; abstract class IStudyRepository implements ModelRepository { Future launch(Study study); Future deleteParticipants(Study study); -//Future deleteProgress(Study study); + // Future deleteProgress(Study study); } class StudyRepository extends ModelRepository implements IStudyRepository { StudyRepository({ + this.sortCallback, required this.apiClient, required this.authRepository, required this.ref, @@ -39,6 +40,8 @@ class StudyRepository extends ModelRepository implements IStudyRepository /// Reference to Riverpod's context to resolve dependencies in callbacks final ProviderRef ref; + final VoidCallback? sortCallback; + @override ModelID getKey(Study model) { return model.id; diff --git a/designer_v2/lib/repositories/user_repository.dart b/designer_v2/lib/repositories/user_repository.dart new file mode 100644 index 000000000..21293958e --- /dev/null +++ b/designer_v2/lib/repositories/user_repository.dart @@ -0,0 +1,62 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:studyu_core/core.dart'; +import 'package:studyu_designer_v2/repositories/api_client.dart'; +import 'package:studyu_designer_v2/repositories/auth_repository.dart'; + +// todo implements ModelRepository +abstract class IUserRepository { + StudyUUser get user; + Future fetchUser(); + Future saveUser(); + Future updatePreferences(PreferenceAction pinAction, String modelId); +} + +enum PreferenceAction { pin, pinOff } + +class UserRepository implements IUserRepository { + UserRepository( + {required this.authRepository, + required this.apiClient, + required this.ref}); //: super(UserRepositoryDelegate(apiClient: apiClient)); + + final StudyUApi apiClient; + final IAuthRepository authRepository; + final Ref ref; + @override + late StudyUUser user; + + @override + Future fetchUser() async { + final userId = ref.read(authRepositoryProvider).currentUser!.id; + user = await apiClient.fetchUser(userId); + return user; + } + + @override + Future saveUser() async { + user = await apiClient.saveUser(user); + return user; + } + + @override + Future updatePreferences(PreferenceAction pinAction, String modelId) async { + final newPinnedStudies = Set.from(user.preferences.pinnedStudies); + switch (pinAction) { + case PreferenceAction.pin: + newPinnedStudies.add(modelId); + break; + case PreferenceAction.pinOff: + newPinnedStudies.remove(modelId); + break; + } + user.preferences.pinnedStudies = newPinnedStudies; + return saveUser(); + } +} + +final userRepositoryProvider = Provider.autoDispose((ref) { + print("userRepositoryProvider"); + final apiClient = ref.watch(apiClientProvider); + final authRepository = ref.watch(authRepositoryProvider); + return UserRepository(apiClient: apiClient, ref: ref, authRepository: authRepository); +}); diff --git a/designer_v2/lib/utils/behaviour_subject.dart b/designer_v2/lib/utils/behaviour_subject.dart index 705f990b4..b82f56f6b 100644 --- a/designer_v2/lib/utils/behaviour_subject.dart +++ b/designer_v2/lib/utils/behaviour_subject.dart @@ -18,8 +18,6 @@ class SuppressedBehaviorSubject { return; } if (!subject.isClosed) { - // todo delme - print("BehaviourSubject push event: $event"); controller.add(event); } }); diff --git a/designer_v2/pubspec.lock b/designer_v2/pubspec.lock index fe9bb3543..a765b4d13 100644 --- a/designer_v2/pubspec.lock +++ b/designer_v2/pubspec.lock @@ -181,14 +181,6 @@ packages: description: flutter source: sdk version: "0.0.0" - freezed_annotation: - dependency: transitive - description: - name: freezed_annotation - sha256: "70776c4541e5cacfe45bcaf00fe79137b8c61aa34fb5765a05ce6c57fd72c6e9" - url: "https://pub.dev" - source: hosted - version: "0.14.3" functions_client: dependency: transitive description: @@ -333,6 +325,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" + multi_select_flutter: + dependency: transitive + description: + name: multi_select_flutter + sha256: "503857b415d390d29159df8a9d92d83c6aac17aaf1c307fb7bcfc77d097d20ed" + url: "https://pub.dev" + source: hosted + version: "4.1.3" path: dependency: transitive description: @@ -461,6 +461,14 @@ packages: url: "https://pub.dev" source: hosted version: "15.0.0" + reactive_multi_select_flutter: + dependency: "direct main" + description: + name: reactive_multi_select_flutter + sha256: c610cbd86eb11f4f7231642911e9a0eeba34177cd1286aca984ef8ef3827684f + url: "https://pub.dev" + source: hosted + version: "1.0.0" realtime_client: dependency: transitive description: @@ -832,14 +840,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.0" - yaml: - dependency: transitive - description: - name: yaml - sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" - url: "https://pub.dev" - source: hosted - version: "3.1.2" yet_another_json_isolate: dependency: transitive description: diff --git a/designer_v2/pubspec.yaml b/designer_v2/pubspec.yaml index 5becc458d..b6dde446b 100644 --- a/designer_v2/pubspec.yaml +++ b/designer_v2/pubspec.yaml @@ -27,6 +27,7 @@ dependencies: pointer_interceptor: ^0.9.3+4 reactive_color_picker: ^1.0.0 # reactive_forms >=16.0.0 reactive_forms: ^15.0.0 # >=intl 18.0.1 + reactive_multi_select_flutter: ^1.0.0 rxdart: ^0.27.7 shared_preferences: ^2.2.0 studyu_core: ^4.3.0-dev.7 diff --git a/docker/supabase/tests/010-study.sql b/docker/supabase/tests/010-study.sql index 82b61d306..d792ef10d 100644 --- a/docker/supabase/tests/010-study.sql +++ b/docker/supabase/tests/010-study.sql @@ -296,7 +296,7 @@ INSERT INTO public.study ( -- -- plan tests in advance, this ensures the proper number of tests have been run. -SELECT plan(17); +SELECT plan(19); -- UNRESTRICTED TESTS diff --git a/docs/database/README.md b/docs/database/README.md index 7b74ad539..cadb30a97 100644 --- a/docs/database/README.md +++ b/docs/database/README.md @@ -23,7 +23,7 @@ | [public.study_invite](public.study_invite.md) | 3 | Study invite codes | BASE TABLE | | [public.subject_progress](public.subject_progress.md) | 6 | | BASE TABLE | | [public.study_progress_export](public.study_progress_export.md) | 10 | | VIEW | -| [public.user](public.user.md) | 2 | Users get automatically added, when a new user is created in auth.users | BASE TABLE | +| [public.user](public.user.md) | 3 | Users get automatically added, when a new user is created in auth.users | BASE TABLE | | [extensions.pg_stat_statements_info](extensions.pg_stat_statements_info.md) | 2 | | VIEW | | [extensions.pg_stat_statements](extensions.pg_stat_statements.md) | 43 | | VIEW | | [pgsodium.key](pgsodium.key.md) | 14 | This table holds metadata for derived keys given a key_id and key_context. The raw key is never stored. | BASE TABLE | diff --git a/docs/database/public.repo.md b/docs/database/public.repo.md index ee7c2e733..9e45555ca 100644 --- a/docs/database/public.repo.md +++ b/docs/database/public.repo.md @@ -17,8 +17,8 @@ Git repo where the generated project is stored | Name | Type | Definition | | ---- | ---- | ---------- | -| repo_pkey | PRIMARY KEY | PRIMARY KEY (project_id) | | repo_studyId_fkey | FOREIGN KEY | FOREIGN KEY (study_id) REFERENCES study(id) | +| repo_pkey | PRIMARY KEY | PRIMARY KEY (project_id) | | repo_userId_fkey | FOREIGN KEY | FOREIGN KEY (user_id) REFERENCES "user"(id) ON DELETE CASCADE | ## Indexes diff --git a/docs/database/public.repo.svg b/docs/database/public.repo.svg index 10ff186e8..ac7efbd9a 100644 --- a/docs/database/public.repo.svg +++ b/docs/database/public.repo.svg @@ -34,23 +34,26 @@ public.user - - -public.user -     -[BASE TABLE] - -id     -[uuid] - -email     -[text] + + +public.user +     +[BASE TABLE] + +id     +[uuid] + +email     +[text] + +preferences     +[jsonb] public.repo:user_id->public.user:id - - + + FOREIGN KEY (user_id) REFERENCES "user"(id) ON DELETE CASCADE diff --git a/docs/database/public.study.md b/docs/database/public.study.md index c546dc6fb..96eddd9f7 100644 --- a/docs/database/public.study.md +++ b/docs/database/public.study.md @@ -32,6 +32,7 @@ | Name | Type | Definition | | ---- | ---- | ---------- | +| study_id_key | UNIQUE | UNIQUE (id) | | study_pkey | PRIMARY KEY | PRIMARY KEY (id) | | study_userId_fkey | FOREIGN KEY | FOREIGN KEY (user_id) REFERENCES "user"(id) | @@ -39,6 +40,7 @@ | Name | Definition | | ---- | ---------- | +| study_id_key | CREATE UNIQUE INDEX study_id_key ON public.study USING btree (id) | | study_pkey | CREATE UNIQUE INDEX study_pkey ON public.study USING btree (id) | ## Triggers diff --git a/docs/database/public.study.svg b/docs/database/public.study.svg index a4366a323..dec6fcf50 100644 --- a/docs/database/public.study.svg +++ b/docs/database/public.study.svg @@ -4,195 +4,198 @@ - - + + public.study - + public.study - - -public.study -     -[BASE TABLE] + + +public.study +     +[BASE TABLE] + +id +[uuid] -id -[uuid] +contact +[jsonb] -contact -[jsonb] +title +[text] -title -[text] +description +[text] -description -[text] +icon_name +[text] -icon_name -[text] +published +[boolean] -published -[boolean] +registry_published +[boolean] -registry_published -[boolean] +questionnaire +[jsonb] -questionnaire -[jsonb] +eligibility_criteria +[jsonb] -eligibility_criteria -[jsonb] +observations +[jsonb] -observations -[jsonb] +interventions +[jsonb] -interventions -[jsonb] +consent +[jsonb] -consent -[jsonb] +schedule +[jsonb] -schedule -[jsonb] +report_specification +[jsonb] -report_specification -[jsonb] +results +[jsonb] -results -[jsonb] +created_at +[timestamp with time zone] -created_at -[timestamp with time zone] +updated_at +[timestamp with time zone] -updated_at -[timestamp with time zone] +user_id +[uuid] -user_id -[uuid] +participation +[participation] -participation -[participation] +result_sharing +[result_sharing] -result_sharing -[result_sharing] - -collaborator_emails -[text[]] - +collaborator_emails +[text[]] + public.user - - -public.user -     -[BASE TABLE] + + +public.user +     +[BASE TABLE] + +id     +[uuid] -id     -[uuid] +email     +[text] -email     -[text] +preferences     +[jsonb] public.study:user_id->public.user:id - - -FOREIGN KEY (user_id) REFERENCES "user"(id) + + +FOREIGN KEY (user_id) REFERENCES "user"(id) public.study_subject - - -public.study_subject -     -[BASE TABLE] + + +public.study_subject +     +[BASE TABLE] + +id     +[uuid] -id     -[uuid] +study_id     +[uuid] -study_id     -[uuid] +user_id     +[uuid] -user_id     -[uuid] +started_at     +[timestamp with time zone] -started_at     -[timestamp with time zone] +selected_intervention_ids     +[text[]] -selected_intervention_ids     -[text[]] +invite_code     +[text] -invite_code     -[text] - -is_deleted     -[boolean] +is_deleted     +[boolean] public.study_subject:study_id->public.study:id - - -FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE + + +FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE public.repo - - -public.repo -     -[BASE TABLE] + + +public.repo +     +[BASE TABLE] + +project_id     +[text] -project_id     -[text] +user_id     +[uuid] -user_id     -[uuid] +study_id     +[uuid] -study_id     -[uuid] - -provider     -[git_provider] +provider     +[git_provider] public.repo:study_id->public.study:id - - -FOREIGN KEY (study_id) REFERENCES study(id) + + +FOREIGN KEY (study_id) REFERENCES study(id) public.study_invite - - -public.study_invite -     -[BASE TABLE] + + +public.study_invite +     +[BASE TABLE] + +code     +[text] -code     -[text] +study_id     +[uuid] -study_id     -[uuid] - -preselected_intervention_ids     -[text[]] +preselected_intervention_ids     +[text[]] public.study_invite:study_id->public.study:id - - -FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE + + +FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE diff --git a/docs/database/public.study_invite.md b/docs/database/public.study_invite.md index 050c6b158..79c271b4f 100644 --- a/docs/database/public.study_invite.md +++ b/docs/database/public.study_invite.md @@ -16,8 +16,8 @@ Study invite codes | Name | Type | Definition | | ---- | ---- | ---------- | -| study_invite_pkey | PRIMARY KEY | PRIMARY KEY (code) | | study_invite_studyId_fkey | FOREIGN KEY | FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE | +| study_invite_pkey | PRIMARY KEY | PRIMARY KEY (code) | ## Indexes diff --git a/docs/database/public.study_subject.md b/docs/database/public.study_subject.md index e921ea870..76d3dd93c 100644 --- a/docs/database/public.study_subject.md +++ b/docs/database/public.study_subject.md @@ -18,8 +18,8 @@ | Name | Type | Definition | | ---- | ---- | ---------- | -| study_subject_loginCode_fkey | FOREIGN KEY | FOREIGN KEY (invite_code) REFERENCES study_invite(code) ON DELETE CASCADE | | study_subject_studyId_fkey | FOREIGN KEY | FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE | +| study_subject_loginCode_fkey | FOREIGN KEY | FOREIGN KEY (invite_code) REFERENCES study_invite(code) ON DELETE CASCADE | | study_subject_pkey | PRIMARY KEY | PRIMARY KEY (id) | | study_subject_userId_fkey | FOREIGN KEY | FOREIGN KEY (user_id) REFERENCES "user"(id) | diff --git a/docs/database/public.study_subject.svg b/docs/database/public.study_subject.svg index 12e0d99cd..00b4f83b2 100644 --- a/docs/database/public.study_subject.svg +++ b/docs/database/public.study_subject.svg @@ -122,23 +122,26 @@ public.user - - -public.user -     -[BASE TABLE] - -id     -[uuid] - -email     -[text] + + +public.user +     +[BASE TABLE] + +id     +[uuid] + +email     +[text] + +preferences     +[jsonb] public.study_subject:user_id->public.user:id - - + + FOREIGN KEY (user_id) REFERENCES "user"(id) diff --git a/docs/database/public.study_tag.md b/docs/database/public.study_tag.md new file mode 100644 index 000000000..c04ba255c --- /dev/null +++ b/docs/database/public.study_tag.md @@ -0,0 +1,32 @@ +# public.study_tag + +## Description + +## Columns + +| Name | Type | Default | Nullable | Children | Parents | Comment | +| ---- | ---- | ------- | -------- | -------- | ------- | ------- | +| study_id | uuid | | false | | [public.study](public.study.md) | | +| tag_id | uuid | | false | | [public.tag](public.tag.md) | | + +## Constraints + +| Name | Type | Definition | +| ---- | ---- | ---------- | +| study_tag_studyId_fkey | FOREIGN KEY | FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE | +| study_tag_tagId_fkey | FOREIGN KEY | FOREIGN KEY (tag_id) REFERENCES tag(id) ON DELETE CASCADE | +| study_tag_pkey | PRIMARY KEY | PRIMARY KEY (study_id, tag_id) | + +## Indexes + +| Name | Definition | +| ---- | ---------- | +| study_tag_pkey | CREATE UNIQUE INDEX study_tag_pkey ON public.study_tag USING btree (study_id, tag_id) | + +## Relations + +![er](public.study_tag.svg) + +--- + +> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/public.study_tag.svg b/docs/database/public.study_tag.svg new file mode 100644 index 000000000..8df118323 --- /dev/null +++ b/docs/database/public.study_tag.svg @@ -0,0 +1,130 @@ + + + + + + +public.study_tag + + + +public.study_tag + + +public.study_tag +     +[BASE TABLE] + +study_id +[uuid] + +tag_id +[uuid] + + + + +public.study + + +public.study +     +[BASE TABLE] + +id     +[uuid] + +contact     +[jsonb] + +title     +[text] + +description     +[text] + +icon_name     +[text] + +published     +[boolean] + +registry_published     +[boolean] + +questionnaire     +[jsonb] + +eligibility_criteria     +[jsonb] + +observations     +[jsonb] + +interventions     +[jsonb] + +consent     +[jsonb] + +schedule     +[jsonb] + +report_specification     +[jsonb] + +results     +[jsonb] + +created_at     +[timestamp with time zone] + +updated_at     +[timestamp with time zone] + +user_id     +[uuid] + +participation     +[participation] + +result_sharing     +[result_sharing] + +collaborator_emails     +[text[]] + + + +public.study_tag:study_id->public.study:id + + +FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE + + + +public.tag + + +public.tag +     +[BASE TABLE] + +id     +[uuid] + +name     +[text] + + + +public.study_tag:tag_id->public.tag:id + + +FOREIGN KEY (tag_id) REFERENCES tag(id) ON DELETE CASCADE + + + diff --git a/docs/database/public.tag.md b/docs/database/public.tag.md new file mode 100644 index 000000000..7b5185da3 --- /dev/null +++ b/docs/database/public.tag.md @@ -0,0 +1,32 @@ +# public.tag + +## Description + +## Columns + +| Name | Type | Default | Nullable | Children | Parents | Comment | +| ---- | ---- | ------- | -------- | -------- | ------- | ------- | +| id | uuid | gen_random_uuid() | false | [public.study_tag](public.study_tag.md) | | | +| name | text | | false | | | | + +## Constraints + +| Name | Type | Definition | +| ---- | ---- | ---------- | +| tag_name_key | UNIQUE | UNIQUE (name) | +| tag_pkey | PRIMARY KEY | PRIMARY KEY (id) | + +## Indexes + +| Name | Definition | +| ---- | ---------- | +| tag_name_key | CREATE UNIQUE INDEX tag_name_key ON public.tag USING btree (name) | +| tag_pkey | CREATE UNIQUE INDEX tag_pkey ON public.tag USING btree (id) | + +## Relations + +![er](public.tag.svg) + +--- + +> Generated by [tbls](https://github.com/k1LoW/tbls) diff --git a/docs/database/public.tag.svg b/docs/database/public.tag.svg new file mode 100644 index 000000000..6f2c73503 --- /dev/null +++ b/docs/database/public.tag.svg @@ -0,0 +1,51 @@ + + + + + + +public.tag + + + +public.tag + + +public.tag +     +[BASE TABLE] + +id +[uuid] + +name +[text] + + + + +public.study_tag + + +public.study_tag +     +[BASE TABLE] + +study_id     +[uuid] + +tag_id     +[uuid] + + + +public.study_tag:tag_id->public.tag:id + + +FOREIGN KEY (tag_id) REFERENCES tag(id) ON DELETE CASCADE + + + diff --git a/docs/database/public.user.md b/docs/database/public.user.md index 814110415..5164cc9ca 100644 --- a/docs/database/public.user.md +++ b/docs/database/public.user.md @@ -10,6 +10,7 @@ Users get automatically added, when a new user is created in auth.users | ---- | ---- | ------- | -------- | -------- | ------- | ------- | | id | uuid | | false | [public.study](public.study.md) [public.study_subject](public.study_subject.md) [public.repo](public.repo.md) | | | | email | text | | true | | | | +| preferences | jsonb | | true | | | | ## Constraints diff --git a/docs/database/public.user.svg b/docs/database/public.user.svg index 062c20e4c..696e041a9 100644 --- a/docs/database/public.user.svg +++ b/docs/database/public.user.svg @@ -4,170 +4,173 @@ - - + + public.user - + public.user - - -public.user -     -[BASE TABLE] + + +public.user +     +[BASE TABLE] + +id +[uuid] -id -[uuid] +email +[text] -email -[text] - +preferences +[jsonb] + public.study - - -public.study -     -[BASE TABLE] + + +public.study +     +[BASE TABLE] + +id     +[uuid] -id     -[uuid] +contact     +[jsonb] -contact     -[jsonb] +title     +[text] -title     -[text] +description     +[text] -description     -[text] +icon_name     +[text] -icon_name     -[text] +published     +[boolean] -published     -[boolean] +registry_published     +[boolean] -registry_published     -[boolean] +questionnaire     +[jsonb] -questionnaire     -[jsonb] +eligibility_criteria     +[jsonb] -eligibility_criteria     -[jsonb] +observations     +[jsonb] -observations     -[jsonb] +interventions     +[jsonb] -interventions     -[jsonb] +consent     +[jsonb] -consent     -[jsonb] +schedule     +[jsonb] -schedule     -[jsonb] +report_specification     +[jsonb] -report_specification     -[jsonb] +results     +[jsonb] -results     -[jsonb] +created_at     +[timestamp with time zone] -created_at     -[timestamp with time zone] +updated_at     +[timestamp with time zone] -updated_at     -[timestamp with time zone] +user_id     +[uuid] -user_id     -[uuid] +participation     +[participation] -participation     -[participation] +result_sharing     +[result_sharing] -result_sharing     -[result_sharing] - -collaborator_emails     -[text[]] +collaborator_emails     +[text[]] public.study:user_id->public.user:id - - -FOREIGN KEY (user_id) REFERENCES "user"(id) + + +FOREIGN KEY (user_id) REFERENCES "user"(id) public.study_subject - - -public.study_subject -     -[BASE TABLE] + + +public.study_subject +     +[BASE TABLE] + +id     +[uuid] -id     -[uuid] +study_id     +[uuid] -study_id     -[uuid] +user_id     +[uuid] -user_id     -[uuid] +started_at     +[timestamp with time zone] -started_at     -[timestamp with time zone] +selected_intervention_ids     +[text[]] -selected_intervention_ids     -[text[]] +invite_code     +[text] -invite_code     -[text] - -is_deleted     -[boolean] +is_deleted     +[boolean] public.study_subject:user_id->public.user:id - - -FOREIGN KEY (user_id) REFERENCES "user"(id) + + +FOREIGN KEY (user_id) REFERENCES "user"(id) public.repo - - -public.repo -     -[BASE TABLE] + + +public.repo +     +[BASE TABLE] + +project_id     +[text] -project_id     -[text] +user_id     +[uuid] -user_id     -[uuid] +study_id     +[uuid] -study_id     -[uuid] - -provider     -[git_provider] +provider     +[git_provider] public.repo:user_id->public.user:id - - -FOREIGN KEY (user_id) REFERENCES "user"(id) ON DELETE CASCADE + + +FOREIGN KEY (user_id) REFERENCES "user"(id) ON DELETE CASCADE diff --git a/docs/database/schema.json b/docs/database/schema.json index dc2c74618..3b4bfd974 100644 --- a/docs/database/schema.json +++ b/docs/database/schema.json @@ -1 +1 @@ -{"name":"postgres","desc":"","tables":[{"name":"auth.users","type":"BASE TABLE","comment":"Auth: Stores user login data within a secure schema.","columns":[{"name":"instance_id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"aud","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"role","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"email","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"encrypted_password","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"confirmed_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"invited_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"confirmation_token","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"confirmation_sent_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"recovery_token","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"recovery_sent_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"email_change_token","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"email_change","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"email_change_sent_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"last_sign_in_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"raw_app_meta_data","type":"jsonb","nullable":true,"default":null,"comment":""},{"name":"raw_user_meta_data","type":"jsonb","nullable":true,"default":null,"comment":""},{"name":"is_super_admin","type":"boolean","nullable":true,"default":null,"comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"updated_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""}],"indexes":[{"name":"users_pkey","def":"CREATE UNIQUE INDEX users_pkey ON auth.users USING btree (id)","table":"auth.users","columns":["id"],"comment":""},{"name":"users_email_key","def":"CREATE UNIQUE INDEX users_email_key ON auth.users USING btree (email)","table":"auth.users","columns":["email"],"comment":""},{"name":"users_instance_id_email_idx","def":"CREATE INDEX users_instance_id_email_idx ON auth.users USING btree (instance_id, email)","table":"auth.users","columns":["email","instance_id"],"comment":""},{"name":"users_instance_id_idx","def":"CREATE INDEX users_instance_id_idx ON auth.users USING btree (instance_id)","table":"auth.users","columns":["instance_id"],"comment":""}],"constraints":[{"name":"users_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"auth.users","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""},{"name":"users_email_key","type":"UNIQUE","def":"UNIQUE (email)","table":"auth.users","referenced_table":"","columns":["email"],"referenced_columns":[],"comment":""}],"triggers":[{"name":"on_auth_user_created","def":"CREATE TRIGGER on_auth_user_created AFTER INSERT ON auth.users FOR EACH ROW EXECUTE FUNCTION handle_new_user()","comment":""}],"def":""},{"name":"auth.refresh_tokens","type":"BASE TABLE","comment":"Auth: Store of tokens used to refresh JWT tokens once they expire.","columns":[{"name":"instance_id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"id","type":"bigint","nullable":false,"default":"nextval('auth.refresh_tokens_id_seq'::regclass)","comment":""},{"name":"token","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"user_id","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"revoked","type":"boolean","nullable":true,"default":null,"comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"updated_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""}],"indexes":[{"name":"refresh_tokens_pkey","def":"CREATE UNIQUE INDEX refresh_tokens_pkey ON auth.refresh_tokens USING btree (id)","table":"auth.refresh_tokens","columns":["id"],"comment":""},{"name":"refresh_tokens_instance_id_idx","def":"CREATE INDEX refresh_tokens_instance_id_idx ON auth.refresh_tokens USING btree (instance_id)","table":"auth.refresh_tokens","columns":["instance_id"],"comment":""},{"name":"refresh_tokens_instance_id_user_id_idx","def":"CREATE INDEX refresh_tokens_instance_id_user_id_idx ON auth.refresh_tokens USING btree (instance_id, user_id)","table":"auth.refresh_tokens","columns":["instance_id","user_id"],"comment":""},{"name":"refresh_tokens_token_idx","def":"CREATE INDEX refresh_tokens_token_idx ON auth.refresh_tokens USING btree (token)","table":"auth.refresh_tokens","columns":["token"],"comment":""}],"constraints":[{"name":"refresh_tokens_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"auth.refresh_tokens","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"auth.instances","type":"BASE TABLE","comment":"Auth: Manages users across multiple sites.","columns":[{"name":"id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"uuid","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"raw_base_config","type":"text","nullable":true,"default":null,"comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"updated_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""}],"indexes":[{"name":"instances_pkey","def":"CREATE UNIQUE INDEX instances_pkey ON auth.instances USING btree (id)","table":"auth.instances","columns":["id"],"comment":""}],"constraints":[{"name":"instances_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"auth.instances","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"auth.audit_log_entries","type":"BASE TABLE","comment":"Auth: Audit trail for user actions.","columns":[{"name":"instance_id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"payload","type":"json","nullable":true,"default":null,"comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""}],"indexes":[{"name":"audit_log_entries_pkey","def":"CREATE UNIQUE INDEX audit_log_entries_pkey ON auth.audit_log_entries USING btree (id)","table":"auth.audit_log_entries","columns":["id"],"comment":""},{"name":"audit_logs_instance_id_idx","def":"CREATE INDEX audit_logs_instance_id_idx ON auth.audit_log_entries USING btree (instance_id)","table":"auth.audit_log_entries","columns":["instance_id"],"comment":""}],"constraints":[{"name":"audit_log_entries_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"auth.audit_log_entries","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"auth.schema_migrations","type":"BASE TABLE","comment":"Auth: Manages updates to the auth system.","columns":[{"name":"version","type":"varchar(255)","nullable":false,"default":null,"comment":""}],"indexes":[{"name":"schema_migrations_pkey","def":"CREATE UNIQUE INDEX schema_migrations_pkey ON auth.schema_migrations USING btree (version)","table":"auth.schema_migrations","columns":["version"],"comment":""}],"constraints":[{"name":"schema_migrations_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (version)","table":"auth.schema_migrations","referenced_table":"","columns":["version"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"storage.buckets","type":"BASE TABLE","comment":"","columns":[{"name":"id","type":"text","nullable":false,"default":null,"comment":""},{"name":"name","type":"text","nullable":false,"default":null,"comment":""},{"name":"owner","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":true,"default":"now()","comment":""},{"name":"updated_at","type":"timestamp with time zone","nullable":true,"default":"now()","comment":""}],"indexes":[{"name":"buckets_pkey","def":"CREATE UNIQUE INDEX buckets_pkey ON storage.buckets USING btree (id)","table":"storage.buckets","columns":["id"],"comment":""},{"name":"bname","def":"CREATE UNIQUE INDEX bname ON storage.buckets USING btree (name)","table":"storage.buckets","columns":["name"],"comment":""}],"constraints":[{"name":"buckets_owner_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (owner) REFERENCES auth.users(id)","table":"storage.buckets","referenced_table":"users","columns":["owner"],"referenced_columns":["id"],"comment":""},{"name":"buckets_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"storage.buckets","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"storage.objects","type":"BASE TABLE","comment":"","columns":[{"name":"id","type":"uuid","nullable":false,"default":"uuid_generate_v4()","comment":""},{"name":"bucket_id","type":"text","nullable":true,"default":null,"comment":""},{"name":"name","type":"text","nullable":true,"default":null,"comment":""},{"name":"owner","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":true,"default":"now()","comment":""},{"name":"updated_at","type":"timestamp with time zone","nullable":true,"default":"now()","comment":""},{"name":"last_accessed_at","type":"timestamp with time zone","nullable":true,"default":"now()","comment":""},{"name":"metadata","type":"jsonb","nullable":true,"default":null,"comment":""}],"indexes":[{"name":"objects_pkey","def":"CREATE UNIQUE INDEX objects_pkey ON storage.objects USING btree (id)","table":"storage.objects","columns":["id"],"comment":""},{"name":"bucketid_objname","def":"CREATE UNIQUE INDEX bucketid_objname ON storage.objects USING btree (bucket_id, name)","table":"storage.objects","columns":["bucket_id","name"],"comment":""},{"name":"name_prefix_search","def":"CREATE INDEX name_prefix_search ON storage.objects USING btree (name text_pattern_ops)","table":"storage.objects","columns":["name"],"comment":""}],"constraints":[{"name":"objects_owner_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (owner) REFERENCES auth.users(id)","table":"storage.objects","referenced_table":"users","columns":["owner"],"referenced_columns":["id"],"comment":""},{"name":"objects_bucketId_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (bucket_id) REFERENCES storage.buckets(id)","table":"storage.objects","referenced_table":"buckets","columns":["bucket_id"],"referenced_columns":["id"],"comment":""},{"name":"objects_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"storage.objects","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"storage.migrations","type":"BASE TABLE","comment":"","columns":[{"name":"id","type":"integer","nullable":false,"default":null,"comment":""},{"name":"name","type":"varchar(100)","nullable":false,"default":null,"comment":""},{"name":"hash","type":"varchar(40)","nullable":false,"default":null,"comment":""},{"name":"executed_at","type":"timestamp without time zone","nullable":true,"default":"CURRENT_TIMESTAMP","comment":""}],"indexes":[{"name":"migrations_pkey","def":"CREATE UNIQUE INDEX migrations_pkey ON storage.migrations USING btree (id)","table":"storage.migrations","columns":["id"],"comment":""},{"name":"migrations_name_key","def":"CREATE UNIQUE INDEX migrations_name_key ON storage.migrations USING btree (name)","table":"storage.migrations","columns":["name"],"comment":""}],"constraints":[{"name":"migrations_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"storage.migrations","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""},{"name":"migrations_name_key","type":"UNIQUE","def":"UNIQUE (name)","table":"storage.migrations","referenced_table":"","columns":["name"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"net.http_request_queue","type":"BASE TABLE","comment":"","columns":[{"name":"id","type":"bigint","nullable":false,"default":"nextval('net.http_request_queue_id_seq'::regclass)","comment":""},{"name":"method","type":"net.http_method","nullable":false,"default":null,"comment":""},{"name":"url","type":"text","nullable":false,"default":null,"comment":""},{"name":"headers","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"body","type":"bytea","nullable":true,"default":null,"comment":""},{"name":"timeout_milliseconds","type":"integer","nullable":false,"default":null,"comment":""}],"indexes":[],"constraints":[],"triggers":[],"def":""},{"name":"net._http_response","type":"BASE TABLE","comment":"","columns":[{"name":"id","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"status_code","type":"integer","nullable":true,"default":null,"comment":""},{"name":"content_type","type":"text","nullable":true,"default":null,"comment":""},{"name":"headers","type":"jsonb","nullable":true,"default":null,"comment":""},{"name":"content","type":"text","nullable":true,"default":null,"comment":""},{"name":"timed_out","type":"boolean","nullable":true,"default":null,"comment":""},{"name":"error_msg","type":"text","nullable":true,"default":null,"comment":""},{"name":"created","type":"timestamp with time zone","nullable":false,"default":"now()","comment":""}],"indexes":[{"name":"_http_response_created_idx","def":"CREATE INDEX _http_response_created_idx ON net._http_response USING btree (created)","table":"net._http_response","columns":["created"],"comment":""}],"constraints":[],"triggers":[],"def":""},{"name":"supabase_functions.migrations","type":"BASE TABLE","comment":"","columns":[{"name":"version","type":"text","nullable":false,"default":null,"comment":""},{"name":"inserted_at","type":"timestamp with time zone","nullable":false,"default":"now()","comment":""}],"indexes":[{"name":"migrations_pkey","def":"CREATE UNIQUE INDEX migrations_pkey ON supabase_functions.migrations USING btree (version)","table":"supabase_functions.migrations","columns":["version"],"comment":""}],"constraints":[{"name":"migrations_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (version)","table":"supabase_functions.migrations","referenced_table":"","columns":["version"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"supabase_functions.hooks","type":"BASE TABLE","comment":"Supabase Functions Hooks: Audit trail for triggered hooks.","columns":[{"name":"id","type":"bigint","nullable":false,"default":"nextval('supabase_functions.hooks_id_seq'::regclass)","comment":""},{"name":"hook_table_id","type":"integer","nullable":false,"default":null,"comment":""},{"name":"hook_name","type":"text","nullable":false,"default":null,"comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":false,"default":"now()","comment":""},{"name":"request_id","type":"bigint","nullable":true,"default":null,"comment":""}],"indexes":[{"name":"hooks_pkey","def":"CREATE UNIQUE INDEX hooks_pkey ON supabase_functions.hooks USING btree (id)","table":"supabase_functions.hooks","columns":["id"],"comment":""},{"name":"supabase_functions_hooks_request_id_idx","def":"CREATE INDEX supabase_functions_hooks_request_id_idx ON supabase_functions.hooks USING btree (request_id)","table":"supabase_functions.hooks","columns":["request_id"],"comment":""},{"name":"supabase_functions_hooks_h_table_id_h_name_idx","def":"CREATE INDEX supabase_functions_hooks_h_table_id_h_name_idx ON supabase_functions.hooks USING btree (hook_table_id, hook_name)","table":"supabase_functions.hooks","columns":["hook_name","hook_table_id"],"comment":""}],"constraints":[{"name":"hooks_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"supabase_functions.hooks","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"public.study","type":"BASE TABLE","comment":"","columns":[{"name":"id","type":"uuid","nullable":false,"default":"gen_random_uuid()","comment":""},{"name":"contact","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"title","type":"text","nullable":false,"default":null,"comment":""},{"name":"description","type":"text","nullable":false,"default":null,"comment":""},{"name":"icon_name","type":"text","nullable":false,"default":null,"comment":""},{"name":"published","type":"boolean","nullable":false,"default":"false","comment":""},{"name":"registry_published","type":"boolean","nullable":false,"default":"false","comment":""},{"name":"questionnaire","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"eligibility_criteria","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"observations","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"interventions","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"consent","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"schedule","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"report_specification","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"results","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":false,"default":"now()","comment":""},{"name":"updated_at","type":"timestamp with time zone","nullable":false,"default":"now()","comment":""},{"name":"user_id","type":"uuid","nullable":false,"default":null,"comment":"UserId of study creator"},{"name":"participation","type":"participation","nullable":false,"default":"'invite'::participation","comment":""},{"name":"result_sharing","type":"result_sharing","nullable":false,"default":"'private'::result_sharing","comment":""},{"name":"collaborator_emails","type":"text[]","nullable":false,"default":"'{}'::text[]","comment":""}],"indexes":[{"name":"study_pkey","def":"CREATE UNIQUE INDEX study_pkey ON public.study USING btree (id)","table":"public.study","columns":["id"],"comment":""}],"constraints":[{"name":"study_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"public.study","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""},{"name":"study_userId_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (user_id) REFERENCES \"user\"(id)","table":"public.study","referenced_table":"user","columns":["user_id"],"referenced_columns":["id"],"comment":""}],"triggers":[{"name":"handle_updated_at","def":"CREATE TRIGGER handle_updated_at BEFORE UPDATE ON public.study FOR EACH ROW EXECUTE FUNCTION moddatetime('updated_at')","comment":""}],"def":""},{"name":"public.study_subject","type":"BASE TABLE","comment":"","columns":[{"name":"id","type":"uuid","nullable":false,"default":"gen_random_uuid()","comment":""},{"name":"study_id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"user_id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"started_at","type":"timestamp with time zone","nullable":true,"default":"now()","comment":""},{"name":"selected_intervention_ids","type":"text[]","nullable":false,"default":null,"comment":""},{"name":"invite_code","type":"text","nullable":true,"default":null,"comment":""},{"name":"is_deleted","type":"boolean","nullable":false,"default":"false","comment":""}],"indexes":[{"name":"study_subject_pkey","def":"CREATE UNIQUE INDEX study_subject_pkey ON public.study_subject USING btree (id)","table":"public.study_subject","columns":["id"],"comment":""}],"constraints":[{"name":"study_subject_loginCode_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (invite_code) REFERENCES study_invite(code) ON DELETE CASCADE","table":"public.study_subject","referenced_table":"study_invite","columns":["invite_code"],"referenced_columns":["code"],"comment":""},{"name":"study_subject_studyId_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE","table":"public.study_subject","referenced_table":"study","columns":["study_id"],"referenced_columns":["id"],"comment":""},{"name":"study_subject_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"public.study_subject","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""},{"name":"study_subject_userId_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (user_id) REFERENCES \"user\"(id)","table":"public.study_subject","referenced_table":"user","columns":["user_id"],"referenced_columns":["id"],"comment":""}],"triggers":[],"def":""},{"name":"public.app_config","type":"BASE TABLE","comment":"Stores app config for different envs","columns":[{"name":"id","type":"text","nullable":false,"default":null,"comment":""},{"name":"app_privacy","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"app_terms","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"designer_privacy","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"designer_terms","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"imprint","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"contact","type":"jsonb","nullable":false,"default":"'{\"email\": \"hpi-info@hpi.de\", \"phone\": \"+49-(0)331 5509-0\", \"website\": \"https://hpi.de/\", \"organization\": \"Hasso Plattner Institute\"}'::jsonb","comment":""},{"name":"analytics","type":"jsonb","nullable":true,"default":null,"comment":""}],"indexes":[{"name":"AppConfig_pkey","def":"CREATE UNIQUE INDEX \"AppConfig_pkey\" ON public.app_config USING btree (id)","table":"public.app_config","columns":["id"],"comment":""}],"constraints":[{"name":"AppConfig_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"public.app_config","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"public.repo","type":"BASE TABLE","comment":"Git repo where the generated project is stored","columns":[{"name":"project_id","type":"text","nullable":false,"default":null,"comment":""},{"name":"user_id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"study_id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"provider","type":"git_provider","nullable":false,"default":null,"comment":""}],"indexes":[{"name":"repo_pkey","def":"CREATE UNIQUE INDEX repo_pkey ON public.repo USING btree (project_id)","table":"public.repo","columns":["project_id"],"comment":""}],"constraints":[{"name":"repo_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (project_id)","table":"public.repo","referenced_table":"","columns":["project_id"],"referenced_columns":[],"comment":""},{"name":"repo_studyId_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (study_id) REFERENCES study(id)","table":"public.repo","referenced_table":"study","columns":["study_id"],"referenced_columns":["id"],"comment":""},{"name":"repo_userId_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (user_id) REFERENCES \"user\"(id) ON DELETE CASCADE","table":"public.repo","referenced_table":"user","columns":["user_id"],"referenced_columns":["id"],"comment":""}],"triggers":[],"def":""},{"name":"public.study_invite","type":"BASE TABLE","comment":"Study invite codes","columns":[{"name":"code","type":"text","nullable":false,"default":null,"comment":""},{"name":"study_id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"preselected_intervention_ids","type":"text[]","nullable":true,"default":null,"comment":"Intervention Ids (and order) preselected by study creator"}],"indexes":[{"name":"study_invite_pkey","def":"CREATE UNIQUE INDEX study_invite_pkey ON public.study_invite USING btree (code)","table":"public.study_invite","columns":["code"],"comment":""}],"constraints":[{"name":"study_invite_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (code)","table":"public.study_invite","referenced_table":"","columns":["code"],"referenced_columns":[],"comment":""},{"name":"study_invite_studyId_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE","table":"public.study_invite","referenced_table":"study","columns":["study_id"],"referenced_columns":["id"],"comment":""}],"triggers":[],"def":""},{"name":"public.subject_progress","type":"BASE TABLE","comment":"","columns":[{"name":"completed_at","type":"timestamp with time zone","nullable":false,"default":"timezone('utc'::text, now())","comment":""},{"name":"subject_id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"intervention_id","type":"text","nullable":false,"default":null,"comment":""},{"name":"task_id","type":"text","nullable":false,"default":null,"comment":""},{"name":"result_type","type":"text","nullable":false,"default":null,"comment":""},{"name":"result","type":"jsonb","nullable":false,"default":null,"comment":""}],"indexes":[{"name":"participant_progress_pkey","def":"CREATE UNIQUE INDEX participant_progress_pkey ON public.subject_progress USING btree (completed_at, subject_id)","table":"public.subject_progress","columns":["completed_at","subject_id"],"comment":""}],"constraints":[{"name":"participant_progress_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (completed_at, subject_id)","table":"public.subject_progress","referenced_table":"","columns":["completed_at","subject_id"],"referenced_columns":[],"comment":""},{"name":"participant_progress_subjectId_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (subject_id) REFERENCES study_subject(id) ON DELETE CASCADE","table":"public.subject_progress","referenced_table":"study_subject","columns":["subject_id"],"referenced_columns":["id"],"comment":""}],"triggers":[],"def":""},{"name":"public.study_progress_export","type":"VIEW","comment":"","columns":[{"name":"completed_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"intervention_id","type":"text","nullable":true,"default":null,"comment":""},{"name":"task_id","type":"text","nullable":true,"default":null,"comment":""},{"name":"result_type","type":"text","nullable":true,"default":null,"comment":""},{"name":"result","type":"jsonb","nullable":true,"default":null,"comment":""},{"name":"subject_id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"user_id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"study_id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"started_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"selected_intervention_ids","type":"text[]","nullable":true,"default":null,"comment":""}],"indexes":[],"constraints":[],"triggers":[],"def":"CREATE VIEW study_progress_export AS (\n SELECT subject_progress.completed_at,\n subject_progress.intervention_id,\n subject_progress.task_id,\n subject_progress.result_type,\n subject_progress.result,\n subject_progress.subject_id,\n study_subject.user_id,\n study_subject.study_id,\n study_subject.started_at,\n study_subject.selected_intervention_ids\n FROM study_subject,\n subject_progress\n WHERE (study_subject.id = subject_progress.subject_id)\n)","referenced_tables":["public.study_subject"]},{"name":"public.user","type":"BASE TABLE","comment":"Users get automatically added, when a new user is created in auth.users","columns":[{"name":"id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"email","type":"text","nullable":true,"default":null,"comment":""}],"indexes":[{"name":"user_pkey","def":"CREATE UNIQUE INDEX user_pkey ON public.\"user\" USING btree (id)","table":"public.user","columns":["id"],"comment":""}],"constraints":[{"name":"user_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"public.user","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"extensions.pg_stat_statements_info","type":"VIEW","comment":"","columns":[{"name":"dealloc","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"stats_reset","type":"timestamp with time zone","nullable":true,"default":null,"comment":""}],"indexes":[],"constraints":[],"triggers":[],"def":"CREATE VIEW pg_stat_statements_info AS (\n SELECT pg_stat_statements_info.dealloc,\n pg_stat_statements_info.stats_reset\n FROM pg_stat_statements_info() pg_stat_statements_info(dealloc, stats_reset)\n)","referenced_tables":["pg_stat_statements_info"]},{"name":"extensions.pg_stat_statements","type":"VIEW","comment":"","columns":[{"name":"userid","type":"oid","nullable":true,"default":null,"comment":""},{"name":"dbid","type":"oid","nullable":true,"default":null,"comment":""},{"name":"toplevel","type":"boolean","nullable":true,"default":null,"comment":""},{"name":"queryid","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"query","type":"text","nullable":true,"default":null,"comment":""},{"name":"plans","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"total_plan_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"min_plan_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"max_plan_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"mean_plan_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"stddev_plan_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"calls","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"total_exec_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"min_exec_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"max_exec_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"mean_exec_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"stddev_exec_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"rows","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"shared_blks_hit","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"shared_blks_read","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"shared_blks_dirtied","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"shared_blks_written","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"local_blks_hit","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"local_blks_read","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"local_blks_dirtied","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"local_blks_written","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"temp_blks_read","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"temp_blks_written","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"blk_read_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"blk_write_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"temp_blk_read_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"temp_blk_write_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"wal_records","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"wal_fpi","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"wal_bytes","type":"numeric","nullable":true,"default":null,"comment":""},{"name":"jit_functions","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"jit_generation_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"jit_inlining_count","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"jit_inlining_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"jit_optimization_count","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"jit_optimization_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"jit_emission_count","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"jit_emission_time","type":"double precision","nullable":true,"default":null,"comment":""}],"indexes":[],"constraints":[],"triggers":[],"def":"CREATE VIEW pg_stat_statements AS (\n SELECT pg_stat_statements.userid,\n pg_stat_statements.dbid,\n pg_stat_statements.toplevel,\n pg_stat_statements.queryid,\n pg_stat_statements.query,\n pg_stat_statements.plans,\n pg_stat_statements.total_plan_time,\n pg_stat_statements.min_plan_time,\n pg_stat_statements.max_plan_time,\n pg_stat_statements.mean_plan_time,\n pg_stat_statements.stddev_plan_time,\n pg_stat_statements.calls,\n pg_stat_statements.total_exec_time,\n pg_stat_statements.min_exec_time,\n pg_stat_statements.max_exec_time,\n pg_stat_statements.mean_exec_time,\n pg_stat_statements.stddev_exec_time,\n pg_stat_statements.rows,\n pg_stat_statements.shared_blks_hit,\n pg_stat_statements.shared_blks_read,\n pg_stat_statements.shared_blks_dirtied,\n pg_stat_statements.shared_blks_written,\n pg_stat_statements.local_blks_hit,\n pg_stat_statements.local_blks_read,\n pg_stat_statements.local_blks_dirtied,\n pg_stat_statements.local_blks_written,\n pg_stat_statements.temp_blks_read,\n pg_stat_statements.temp_blks_written,\n pg_stat_statements.blk_read_time,\n pg_stat_statements.blk_write_time,\n pg_stat_statements.temp_blk_read_time,\n pg_stat_statements.temp_blk_write_time,\n pg_stat_statements.wal_records,\n pg_stat_statements.wal_fpi,\n pg_stat_statements.wal_bytes,\n pg_stat_statements.jit_functions,\n pg_stat_statements.jit_generation_time,\n pg_stat_statements.jit_inlining_count,\n pg_stat_statements.jit_inlining_time,\n pg_stat_statements.jit_optimization_count,\n pg_stat_statements.jit_optimization_time,\n pg_stat_statements.jit_emission_count,\n pg_stat_statements.jit_emission_time\n FROM pg_stat_statements(true) pg_stat_statements(userid, dbid, toplevel, queryid, query, plans, total_plan_time, min_plan_time, max_plan_time, mean_plan_time, stddev_plan_time, calls, total_exec_time, min_exec_time, max_exec_time, mean_exec_time, stddev_exec_time, rows, shared_blks_hit, shared_blks_read, shared_blks_dirtied, shared_blks_written, local_blks_hit, local_blks_read, local_blks_dirtied, local_blks_written, temp_blks_read, temp_blks_written, blk_read_time, blk_write_time, temp_blk_read_time, temp_blk_write_time, wal_records, wal_fpi, wal_bytes, jit_functions, jit_generation_time, jit_inlining_count, jit_inlining_time, jit_optimization_count, jit_optimization_time, jit_emission_count, jit_emission_time)\n)","referenced_tables":["pg_stat_statements"]},{"name":"pgsodium.key","type":"BASE TABLE","comment":"This table holds metadata for derived keys given a key_id and key_context. The raw key is never stored.","columns":[{"name":"id","type":"uuid","nullable":false,"default":"gen_random_uuid()","comment":""},{"name":"status","type":"pgsodium.key_status","nullable":true,"default":"'valid'::pgsodium.key_status","comment":""},{"name":"created","type":"timestamp with time zone","nullable":false,"default":"CURRENT_TIMESTAMP","comment":""},{"name":"expires","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"key_type","type":"pgsodium.key_type","nullable":true,"default":null,"comment":""},{"name":"key_id","type":"bigint","nullable":true,"default":"nextval('pgsodium.key_key_id_seq'::regclass)","comment":""},{"name":"key_context","type":"bytea","nullable":true,"default":"'\\x7067736f6469756d'::bytea","comment":""},{"name":"name","type":"text","nullable":true,"default":null,"comment":""},{"name":"associated_data","type":"text","nullable":true,"default":"'associated'::text","comment":""},{"name":"raw_key","type":"bytea","nullable":true,"default":null,"comment":""},{"name":"raw_key_nonce","type":"bytea","nullable":true,"default":null,"comment":""},{"name":"parent_key","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"comment","type":"text","nullable":true,"default":null,"comment":""},{"name":"user_data","type":"text","nullable":true,"default":null,"comment":""}],"indexes":[{"name":"key_pkey","def":"CREATE UNIQUE INDEX key_pkey ON pgsodium.key USING btree (id)","table":"pgsodium.key","columns":["id"],"comment":""},{"name":"key_status_idx","def":"CREATE INDEX key_status_idx ON pgsodium.key USING btree (status) WHERE (status = ANY (ARRAY['valid'::pgsodium.key_status, 'default'::pgsodium.key_status]))","table":"pgsodium.key","columns":["status"],"comment":""},{"name":"key_status_idx1","def":"CREATE UNIQUE INDEX key_status_idx1 ON pgsodium.key USING btree (status) WHERE (status = 'default'::pgsodium.key_status)","table":"pgsodium.key","columns":["status"],"comment":""},{"name":"key_key_id_key_context_key_type_idx","def":"CREATE UNIQUE INDEX key_key_id_key_context_key_type_idx ON pgsodium.key USING btree (key_id, key_context, key_type)","table":"pgsodium.key","columns":["key_context","key_id","key_type"],"comment":""},{"name":"pgsodium_key_unique_name","def":"CREATE UNIQUE INDEX pgsodium_key_unique_name ON pgsodium.key USING btree (name)","table":"pgsodium.key","columns":["name"],"comment":""}],"constraints":[{"name":"key_key_context_check","type":"CHECK","def":"CHECK ((length(key_context) = 8))","table":"pgsodium.key","referenced_table":"","columns":["key_context"],"referenced_columns":[],"comment":""},{"name":"pgsodium_raw","type":"CHECK","def":"CHECK (\nCASE\n WHEN (raw_key IS NOT NULL) THEN ((key_id IS NULL) AND (key_context IS NULL) AND (parent_key IS NOT NULL))\n ELSE ((key_id IS NOT NULL) AND (key_context IS NOT NULL) AND (parent_key IS NULL))\nEND)","table":"pgsodium.key","referenced_table":"","columns":["key_id","key_context","raw_key","parent_key"],"referenced_columns":[],"comment":""},{"name":"key_parent_key_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (parent_key) REFERENCES pgsodium.key(id)","table":"pgsodium.key","referenced_table":"key","columns":["parent_key"],"referenced_columns":["id"],"comment":""},{"name":"key_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"pgsodium.key","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""},{"name":"pgsodium_key_unique_name","type":"UNIQUE","def":"UNIQUE (name)","table":"pgsodium.key","referenced_table":"","columns":["name"],"referenced_columns":[],"comment":""}],"triggers":[{"name":"key_encrypt_secret_trigger_raw_key","def":"CREATE TRIGGER key_encrypt_secret_trigger_raw_key BEFORE INSERT OR UPDATE OF raw_key ON pgsodium.key FOR EACH ROW EXECUTE FUNCTION pgsodium.key_encrypt_secret_raw_key()","comment":""}],"def":""},{"name":"pgsodium.valid_key","type":"VIEW","comment":"","columns":[{"name":"id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"name","type":"text","nullable":true,"default":null,"comment":""},{"name":"status","type":"pgsodium.key_status","nullable":true,"default":null,"comment":""},{"name":"key_type","type":"pgsodium.key_type","nullable":true,"default":null,"comment":""},{"name":"key_id","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"key_context","type":"bytea","nullable":true,"default":null,"comment":""},{"name":"created","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"expires","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"associated_data","type":"text","nullable":true,"default":null,"comment":""}],"indexes":[],"constraints":[],"triggers":[],"def":"CREATE VIEW valid_key AS (\n SELECT key.id,\n key.name,\n key.status,\n key.key_type,\n key.key_id,\n key.key_context,\n key.created,\n key.expires,\n key.associated_data\n FROM pgsodium.key\n WHERE ((key.status = ANY (ARRAY['valid'::pgsodium.key_status, 'default'::pgsodium.key_status])) AND\n CASE\n WHEN (key.expires IS NULL) THEN true\n ELSE (key.expires \u003e now())\n END)\n)","referenced_tables":["pgsodium.key"]},{"name":"pgsodium.masking_rule","type":"VIEW","comment":"","columns":[{"name":"attrelid","type":"oid","nullable":true,"default":null,"comment":""},{"name":"attnum","type":"integer","nullable":true,"default":null,"comment":""},{"name":"relnamespace","type":"regnamespace","nullable":true,"default":null,"comment":""},{"name":"relname","type":"name","nullable":true,"default":null,"comment":""},{"name":"attname","type":"name","nullable":true,"default":null,"comment":""},{"name":"format_type","type":"text","nullable":true,"default":null,"comment":""},{"name":"col_description","type":"text","nullable":true,"default":null,"comment":""},{"name":"key_id_column","type":"text","nullable":true,"default":null,"comment":""},{"name":"key_id","type":"text","nullable":true,"default":null,"comment":""},{"name":"associated_columns","type":"text","nullable":true,"default":null,"comment":""},{"name":"nonce_column","type":"text","nullable":true,"default":null,"comment":""},{"name":"view_name","type":"text","nullable":true,"default":null,"comment":""},{"name":"priority","type":"integer","nullable":true,"default":null,"comment":""}],"indexes":[],"constraints":[],"triggers":[],"def":"CREATE VIEW masking_rule AS (\n WITH const AS (\n SELECT 'encrypt +with +key +id +([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})'::text AS pattern_key_id,\n 'encrypt +with +key +column +([\\w\\\"\\-$]+)'::text AS pattern_key_id_column,\n '(?\u003c=associated) +\\(([\\w\\\"\\-$, ]+)\\)'::text AS pattern_associated_columns,\n '(?\u003c=nonce) +([\\w\\\"\\-$]+)'::text AS pattern_nonce_column,\n '(?\u003c=decrypt with view) +([\\w\\\"\\-$]+\\.[\\w\\\"\\-$]+)'::text AS pattern_view_name\n ), rules_from_seclabels AS (\n SELECT sl.objoid AS attrelid,\n sl.objsubid AS attnum,\n (c.relnamespace)::regnamespace AS relnamespace,\n c.relname,\n a.attname,\n format_type(a.atttypid, a.atttypmod) AS format_type,\n sl.label AS col_description,\n (regexp_match(sl.label, k.pattern_key_id_column, 'i'::text))[1] AS key_id_column,\n (regexp_match(sl.label, k.pattern_key_id, 'i'::text))[1] AS key_id,\n (regexp_match(sl.label, k.pattern_associated_columns, 'i'::text))[1] AS associated_columns,\n (regexp_match(sl.label, k.pattern_nonce_column, 'i'::text))[1] AS nonce_column,\n COALESCE((regexp_match(sl2.label, k.pattern_view_name, 'i'::text))[1], (((c.relnamespace)::regnamespace || '.'::text) || quote_ident(('decrypted_'::text || (c.relname)::text)))) AS view_name,\n 100 AS priority\n FROM const k,\n (((pg_seclabel sl\n JOIN pg_class c ON (((sl.classoid = c.tableoid) AND (sl.objoid = c.oid))))\n JOIN pg_attribute a ON (((a.attrelid = c.oid) AND (sl.objsubid = a.attnum))))\n LEFT JOIN pg_seclabel sl2 ON (((sl2.objoid = c.oid) AND (sl2.objsubid = 0))))\n WHERE ((a.attnum \u003e 0) AND (((c.relnamespace)::regnamespace)::oid \u003c\u003e ('pg_catalog'::regnamespace)::oid) AND (NOT a.attisdropped) AND (sl.label ~~* 'ENCRYPT%'::text) AND (sl.provider = 'pgsodium'::text))\n )\n SELECT DISTINCT ON (rules_from_seclabels.attrelid, rules_from_seclabels.attnum) rules_from_seclabels.attrelid,\n rules_from_seclabels.attnum,\n rules_from_seclabels.relnamespace,\n rules_from_seclabels.relname,\n rules_from_seclabels.attname,\n rules_from_seclabels.format_type,\n rules_from_seclabels.col_description,\n rules_from_seclabels.key_id_column,\n rules_from_seclabels.key_id,\n rules_from_seclabels.associated_columns,\n rules_from_seclabels.nonce_column,\n rules_from_seclabels.view_name,\n rules_from_seclabels.priority\n FROM rules_from_seclabels\n ORDER BY rules_from_seclabels.attrelid, rules_from_seclabels.attnum, rules_from_seclabels.priority DESC\n)"},{"name":"pgsodium.mask_columns","type":"VIEW","comment":"","columns":[{"name":"attname","type":"name","nullable":true,"default":null,"comment":""},{"name":"attrelid","type":"oid","nullable":true,"default":null,"comment":""},{"name":"key_id","type":"text","nullable":true,"default":null,"comment":""},{"name":"key_id_column","type":"text","nullable":true,"default":null,"comment":""},{"name":"associated_columns","type":"text","nullable":true,"default":null,"comment":""},{"name":"nonce_column","type":"text","nullable":true,"default":null,"comment":""},{"name":"format_type","type":"text","nullable":true,"default":null,"comment":""}],"indexes":[],"constraints":[],"triggers":[],"def":"CREATE VIEW mask_columns AS (\n SELECT a.attname,\n a.attrelid,\n m.key_id,\n m.key_id_column,\n m.associated_columns,\n m.nonce_column,\n m.format_type\n FROM (pg_attribute a\n LEFT JOIN pgsodium.masking_rule m ON (((m.attrelid = a.attrelid) AND (m.attname = a.attname))))\n WHERE ((a.attnum \u003e 0) AND (NOT a.attisdropped))\n ORDER BY a.attnum\n)","referenced_tables":["pg_attribute","pgsodium.masking_rule"]},{"name":"pgsodium.decrypted_key","type":"VIEW","comment":"","columns":[{"name":"id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"status","type":"pgsodium.key_status","nullable":true,"default":null,"comment":""},{"name":"created","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"expires","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"key_type","type":"pgsodium.key_type","nullable":true,"default":null,"comment":""},{"name":"key_id","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"key_context","type":"bytea","nullable":true,"default":null,"comment":""},{"name":"name","type":"text","nullable":true,"default":null,"comment":""},{"name":"associated_data","type":"text","nullable":true,"default":null,"comment":""},{"name":"raw_key","type":"bytea","nullable":true,"default":null,"comment":""},{"name":"decrypted_raw_key","type":"bytea","nullable":true,"default":null,"comment":""},{"name":"raw_key_nonce","type":"bytea","nullable":true,"default":null,"comment":""},{"name":"parent_key","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"comment","type":"text","nullable":true,"default":null,"comment":""}],"indexes":[],"constraints":[],"triggers":[],"def":"CREATE VIEW decrypted_key AS (\n SELECT key.id,\n key.status,\n key.created,\n key.expires,\n key.key_type,\n key.key_id,\n key.key_context,\n key.name,\n key.associated_data,\n key.raw_key,\n CASE\n WHEN (key.raw_key IS NULL) THEN NULL::bytea\n ELSE\n CASE\n WHEN (key.parent_key IS NULL) THEN NULL::bytea\n ELSE pgsodium.crypto_aead_det_decrypt(key.raw_key, convert_to(((key.id)::text || key.associated_data), 'utf8'::name), key.parent_key, key.raw_key_nonce)\n END\n END AS decrypted_raw_key,\n key.raw_key_nonce,\n key.parent_key,\n key.comment\n FROM pgsodium.key\n)","referenced_tables":["pgsodium.key"]},{"name":"vault.secrets","type":"BASE TABLE","comment":"Table with encrypted `secret` column for storing sensitive information on disk.","columns":[{"name":"id","type":"uuid","nullable":false,"default":"gen_random_uuid()","comment":""},{"name":"name","type":"text","nullable":true,"default":null,"comment":""},{"name":"description","type":"text","nullable":false,"default":"''::text","comment":""},{"name":"secret","type":"text","nullable":false,"default":null,"comment":""},{"name":"key_id","type":"uuid","nullable":true,"default":"(pgsodium.create_key()).id","comment":""},{"name":"nonce","type":"bytea","nullable":true,"default":"pgsodium.crypto_aead_det_noncegen()","comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":false,"default":"CURRENT_TIMESTAMP","comment":""},{"name":"updated_at","type":"timestamp with time zone","nullable":false,"default":"CURRENT_TIMESTAMP","comment":""}],"indexes":[{"name":"secrets_pkey","def":"CREATE UNIQUE INDEX secrets_pkey ON vault.secrets USING btree (id)","table":"vault.secrets","columns":["id"],"comment":""},{"name":"secrets_name_idx","def":"CREATE UNIQUE INDEX secrets_name_idx ON vault.secrets USING btree (name) WHERE (name IS NOT NULL)","table":"vault.secrets","columns":["name"],"comment":""}],"constraints":[{"name":"secrets_key_id_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (key_id) REFERENCES pgsodium.key(id)","table":"vault.secrets","referenced_table":"key","columns":["key_id"],"referenced_columns":["id"],"comment":""},{"name":"secrets_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"vault.secrets","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""}],"triggers":[{"name":"secrets_encrypt_secret_trigger_secret","def":"CREATE TRIGGER secrets_encrypt_secret_trigger_secret BEFORE INSERT OR UPDATE OF secret ON vault.secrets FOR EACH ROW EXECUTE FUNCTION vault.secrets_encrypt_secret_secret()","comment":""}],"def":""},{"name":"vault.decrypted_secrets","type":"VIEW","comment":"","columns":[{"name":"id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"name","type":"text","nullable":true,"default":null,"comment":""},{"name":"description","type":"text","nullable":true,"default":null,"comment":""},{"name":"secret","type":"text","nullable":true,"default":null,"comment":""},{"name":"decrypted_secret","type":"text","nullable":true,"default":null,"comment":""},{"name":"key_id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"nonce","type":"bytea","nullable":true,"default":null,"comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"updated_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""}],"indexes":[],"constraints":[],"triggers":[],"def":"CREATE VIEW decrypted_secrets AS (\n SELECT secrets.id,\n secrets.name,\n secrets.description,\n secrets.secret,\n CASE\n WHEN (secrets.secret IS NULL) THEN NULL::text\n ELSE\n CASE\n WHEN (secrets.key_id IS NULL) THEN NULL::text\n ELSE convert_from(pgsodium.crypto_aead_det_decrypt(decode(secrets.secret, 'base64'::text), convert_to(((((secrets.id)::text || secrets.description) || (secrets.created_at)::text) || (secrets.updated_at)::text), 'utf8'::name), secrets.key_id, secrets.nonce), 'utf8'::name)\n END\n END AS decrypted_secret,\n secrets.key_id,\n secrets.nonce,\n secrets.created_at,\n secrets.updated_at\n FROM vault.secrets\n)","referenced_tables":["vault.secrets"]}],"relations":[{"table":"storage.buckets","columns":["owner"],"cardinality":"Zero or more","parent_table":"auth.users","parent_columns":["id"],"parent_cardinality":"Zero or one","def":"FOREIGN KEY (owner) REFERENCES auth.users(id)","virtual":false},{"table":"storage.objects","columns":["owner"],"cardinality":"Zero or more","parent_table":"auth.users","parent_columns":["id"],"parent_cardinality":"Zero or one","def":"FOREIGN KEY (owner) REFERENCES auth.users(id)","virtual":false},{"table":"storage.objects","columns":["bucket_id"],"cardinality":"Zero or more","parent_table":"storage.buckets","parent_columns":["id"],"parent_cardinality":"Zero or one","def":"FOREIGN KEY (bucket_id) REFERENCES storage.buckets(id)","virtual":false},{"table":"public.study","columns":["user_id"],"cardinality":"Zero or more","parent_table":"public.user","parent_columns":["id"],"parent_cardinality":"Exactly one","def":"FOREIGN KEY (user_id) REFERENCES \"user\"(id)","virtual":false},{"table":"public.study_subject","columns":["invite_code"],"cardinality":"Zero or more","parent_table":"public.study_invite","parent_columns":["code"],"parent_cardinality":"Zero or one","def":"FOREIGN KEY (invite_code) REFERENCES study_invite(code) ON DELETE CASCADE","virtual":false},{"table":"public.study_subject","columns":["study_id"],"cardinality":"Zero or more","parent_table":"public.study","parent_columns":["id"],"parent_cardinality":"Exactly one","def":"FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE","virtual":false},{"table":"public.study_subject","columns":["user_id"],"cardinality":"Zero or more","parent_table":"public.user","parent_columns":["id"],"parent_cardinality":"Exactly one","def":"FOREIGN KEY (user_id) REFERENCES \"user\"(id)","virtual":false},{"table":"public.repo","columns":["study_id"],"cardinality":"Zero or more","parent_table":"public.study","parent_columns":["id"],"parent_cardinality":"Exactly one","def":"FOREIGN KEY (study_id) REFERENCES study(id)","virtual":false},{"table":"public.repo","columns":["user_id"],"cardinality":"Zero or more","parent_table":"public.user","parent_columns":["id"],"parent_cardinality":"Exactly one","def":"FOREIGN KEY (user_id) REFERENCES \"user\"(id) ON DELETE CASCADE","virtual":false},{"table":"public.study_invite","columns":["study_id"],"cardinality":"Zero or more","parent_table":"public.study","parent_columns":["id"],"parent_cardinality":"Exactly one","def":"FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE","virtual":false},{"table":"public.subject_progress","columns":["subject_id"],"cardinality":"Zero or more","parent_table":"public.study_subject","parent_columns":["id"],"parent_cardinality":"Exactly one","def":"FOREIGN KEY (subject_id) REFERENCES study_subject(id) ON DELETE CASCADE","virtual":false},{"table":"pgsodium.key","columns":["parent_key"],"cardinality":"Zero or more","parent_table":"pgsodium.key","parent_columns":["id"],"parent_cardinality":"Zero or one","def":"FOREIGN KEY (parent_key) REFERENCES pgsodium.key(id)","virtual":false},{"table":"vault.secrets","columns":["key_id"],"cardinality":"Zero or more","parent_table":"pgsodium.key","parent_columns":["id"],"parent_cardinality":"Zero or one","def":"FOREIGN KEY (key_id) REFERENCES pgsodium.key(id)","virtual":false}],"functions":[{"name":"pgsodium.crypto_box_noncegen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"extensions.uuid_generate_v4","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"pgbouncer.get_auth","return_type":"record","arguments":"p_usename text","type":"FUNCTION"},{"name":"storage.filename","return_type":"text","arguments":"name text","type":"FUNCTION"},{"name":"extensions.digest","return_type":"bytea","arguments":"text, text","type":"FUNCTION"},{"name":"storage.foldername","return_type":"_text","arguments":"name text","type":"FUNCTION"},{"name":"extensions.decrypt_iv","return_type":"bytea","arguments":"bytea, bytea, bytea, text","type":"FUNCTION"},{"name":"storage.extension","return_type":"text","arguments":"name text","type":"FUNCTION"},{"name":"extensions.gen_random_bytes","return_type":"bytea","arguments":"integer","type":"FUNCTION"},{"name":"extensions.encrypt","return_type":"bytea","arguments":"bytea, bytea, text","type":"FUNCTION"},{"name":"extensions.decrypt","return_type":"bytea","arguments":"bytea, bytea, text","type":"FUNCTION"},{"name":"extensions.encrypt_iv","return_type":"bytea","arguments":"bytea, bytea, bytea, text","type":"FUNCTION"},{"name":"extensions.gen_random_uuid","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"extensions.uuid_nil","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"extensions.uuid_ns_dns","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"storage.search","return_type":"record","arguments":"prefix text, bucketname text, limits integer DEFAULT 100, levels integer DEFAULT 1, offsets integer DEFAULT 0","type":"FUNCTION"},{"name":"extensions.uuid_ns_url","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"extensions.uuid_ns_oid","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"auth.uid","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"auth.email","return_type":"text","arguments":"","type":"FUNCTION"},{"name":"extensions.uuid_generate_v3","return_type":"uuid","arguments":"namespace uuid, name text","type":"FUNCTION"},{"name":"extensions.uuid_ns_x500","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"extensions.uuid_generate_v1","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"extensions.uuid_generate_v1mc","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"net.check_worker_is_up","return_type":"void","arguments":"","type":"FUNCTION"},{"name":"net._await_response","return_type":"bool","arguments":"request_id bigint","type":"FUNCTION"},{"name":"net._urlencode_string","return_type":"text","arguments":"string character varying","type":"FUNCTION"},{"name":"net._encode_url_with_params_array","return_type":"text","arguments":"url text, params_array text[]","type":"FUNCTION"},{"name":"extensions.pgp_sym_decrypt","return_type":"text","arguments":"bytea, text","type":"FUNCTION"},{"name":"extensions.pgp_sym_decrypt_bytea","return_type":"bytea","arguments":"bytea, text","type":"FUNCTION"},{"name":"extensions.pgp_sym_decrypt","return_type":"text","arguments":"bytea, text, text","type":"FUNCTION"},{"name":"extensions.pgp_sym_decrypt_bytea","return_type":"bytea","arguments":"bytea, text, text","type":"FUNCTION"},{"name":"extensions.pgp_pub_encrypt","return_type":"bytea","arguments":"text, bytea","type":"FUNCTION"},{"name":"extensions.pgp_pub_encrypt_bytea","return_type":"bytea","arguments":"bytea, bytea","type":"FUNCTION"},{"name":"extensions.pgp_pub_encrypt","return_type":"bytea","arguments":"text, bytea, text","type":"FUNCTION"},{"name":"extensions.pgp_pub_encrypt_bytea","return_type":"bytea","arguments":"bytea, bytea, text","type":"FUNCTION"},{"name":"extensions.pgp_pub_decrypt","return_type":"text","arguments":"bytea, bytea","type":"FUNCTION"},{"name":"extensions.pgp_pub_decrypt_bytea","return_type":"bytea","arguments":"bytea, bytea","type":"FUNCTION"},{"name":"net.http_delete","return_type":"int8","arguments":"url text, params jsonb DEFAULT '{}'::jsonb, headers jsonb DEFAULT '{}'::jsonb, timeout_milliseconds integer DEFAULT 2000","type":"FUNCTION"},{"name":"net._http_collect_response","return_type":"http_response_result","arguments":"request_id bigint, async boolean DEFAULT true","type":"FUNCTION"},{"name":"net.http_collect_response","return_type":"http_response_result","arguments":"request_id bigint, async boolean DEFAULT true","type":"FUNCTION"},{"name":"supabase_functions.http_request","return_type":"trigger","arguments":"","type":"FUNCTION"},{"name":"public.active_subject_count","return_type":"int4","arguments":"study study","type":"FUNCTION"},{"name":"public.can_edit","return_type":"bool","arguments":"user_id uuid, study_param study","type":"FUNCTION"},{"name":"public.get_study_from_invite","return_type":"record","arguments":"invite_code text","type":"FUNCTION"},{"name":"public.get_study_record_from_invite","return_type":"study","arguments":"invite_code text","type":"FUNCTION"},{"name":"public.handle_new_user","return_type":"trigger","arguments":"","type":"FUNCTION"},{"name":"public.has_study_ended","return_type":"bool","arguments":"psubject_id uuid","type":"FUNCTION"},{"name":"public.has_study_ended","return_type":"bool","arguments":"subject study_subject","type":"FUNCTION"},{"name":"public.is_active_subject","return_type":"bool","arguments":"psubject_id uuid, days_active integer","type":"FUNCTION"},{"name":"public.is_study_subject_of","return_type":"bool","arguments":"_user_id uuid, _study_id uuid","type":"FUNCTION"},{"name":"public.last_completed_task","return_type":"date","arguments":"psubject_id uuid","type":"FUNCTION"},{"name":"public.study_active_days","return_type":"_int4","arguments":"study_param study","type":"FUNCTION"},{"name":"public.study_ended_count","return_type":"int4","arguments":"study study","type":"FUNCTION"},{"name":"public.study_length","return_type":"int4","arguments":"study_param study","type":"FUNCTION"},{"name":"public.study_missed_days","return_type":"_int4","arguments":"study_param study","type":"FUNCTION"},{"name":"public.study_participant_count","return_type":"int4","arguments":"study study","type":"FUNCTION"},{"name":"public.study_total_tasks","return_type":"int4","arguments":"subject study_subject","type":"FUNCTION"},{"name":"net.http_get","return_type":"int8","arguments":"url text, params jsonb DEFAULT '{}'::jsonb, headers jsonb DEFAULT '{}'::jsonb, timeout_milliseconds integer DEFAULT 2000","type":"FUNCTION"},{"name":"extensions.pgp_pub_decrypt_bytea","return_type":"bytea","arguments":"bytea, bytea, text, text","type":"FUNCTION"},{"name":"extensions.pgp_key_id","return_type":"text","arguments":"bytea","type":"FUNCTION"},{"name":"extensions.armor","return_type":"text","arguments":"bytea","type":"FUNCTION"},{"name":"extensions.armor","return_type":"text","arguments":"bytea, text[], text[]","type":"FUNCTION"},{"name":"extensions.dearmor","return_type":"bytea","arguments":"text","type":"FUNCTION"},{"name":"extensions.pgp_armor_headers","return_type":"record","arguments":"text, OUT key text, OUT value text","type":"FUNCTION"},{"name":"extensions.url_encode","return_type":"text","arguments":"data bytea","type":"FUNCTION"},{"name":"extensions.url_decode","return_type":"bytea","arguments":"data text","type":"FUNCTION"},{"name":"extensions.algorithm_sign","return_type":"text","arguments":"signables text, secret text, algorithm text","type":"FUNCTION"},{"name":"public.subject_current_day","return_type":"int4","arguments":"subject study_subject","type":"FUNCTION"},{"name":"public.subject_total_active_days","return_type":"int4","arguments":"subject study_subject","type":"FUNCTION"},{"name":"public.user_email","return_type":"text","arguments":"user_id uuid","type":"FUNCTION"},{"name":"extensions.hmac","return_type":"bytea","arguments":"bytea, bytea, text","type":"FUNCTION"},{"name":"auth.role","return_type":"text","arguments":"","type":"FUNCTION"},{"name":"extensions.uuid_generate_v5","return_type":"uuid","arguments":"namespace uuid, name text","type":"FUNCTION"},{"name":"extensions.digest","return_type":"bytea","arguments":"bytea, text","type":"FUNCTION"},{"name":"extensions.hmac","return_type":"bytea","arguments":"text, text, text","type":"FUNCTION"},{"name":"extensions.crypt","return_type":"text","arguments":"text, text","type":"FUNCTION"},{"name":"extensions.gen_salt","return_type":"text","arguments":"text","type":"FUNCTION"},{"name":"extensions.gen_salt","return_type":"text","arguments":"text, integer","type":"FUNCTION"},{"name":"extensions.try_cast_double","return_type":"float8","arguments":"inp text","type":"FUNCTION"},{"name":"extensions.moddatetime","return_type":"trigger","arguments":"","type":"FUNCTION"},{"name":"extensions.pgrst_drop_watch","return_type":"event_trigger","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_pwhash_saltgen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"extensions.pgrst_ddl_watch","return_type":"event_trigger","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_kx_client_session_keys","return_type":"crypto_kx_session","arguments":"client_pk bytea, client_sk bytea, server_pk bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_kx_server_session_keys","return_type":"crypto_kx_session","arguments":"server_pk bytea, server_sk bytea, client_pk bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha512_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_box_new_seed","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_new_seed","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"extensions.set_graphql_placeholder","return_type":"event_trigger","arguments":"","type":"FUNCTION"},{"name":"extensions.grant_pg_graphql_access","return_type":"event_trigger","arguments":"","type":"FUNCTION"},{"name":"graphql_public.graphql","return_type":"jsonb","arguments":"\"operationName\" text DEFAULT NULL::text, query text DEFAULT NULL::text, variables jsonb DEFAULT NULL::jsonb, extensions jsonb DEFAULT NULL::jsonb","type":"FUNCTION"},{"name":"graphql.resolve","return_type":"jsonb","arguments":"query text, variables jsonb DEFAULT '{}'::jsonb, \"operationName\" text DEFAULT NULL::text, extensions jsonb DEFAULT NULL::jsonb","type":"FUNCTION"},{"name":"graphql.increment_schema_version","return_type":"event_trigger","arguments":"","type":"FUNCTION"},{"name":"graphql.get_schema_version","return_type":"int4","arguments":"","type":"FUNCTION"},{"name":"graphql.comment_directive","return_type":"jsonb","arguments":"comment_ text","type":"FUNCTION"},{"name":"graphql.exception","return_type":"text","arguments":"message text","type":"FUNCTION"},{"name":"net.http_post","return_type":"int8","arguments":"url text, body jsonb DEFAULT '{}'::jsonb, params jsonb DEFAULT '{}'::jsonb, headers jsonb DEFAULT '{\"Content-Type\": \"application/json\"}'::jsonb, timeout_milliseconds integer DEFAULT 2000","type":"FUNCTION"},{"name":"pgsodium.derive_key","return_type":"bytea","arguments":"key_id bigint, key_len integer DEFAULT 32, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.pgsodium_derive","return_type":"bytea","arguments":"key_id bigint, key_len integer DEFAULT 32, context bytea DEFAULT decode('pgsodium'::text, 'escape'::text)","type":"FUNCTION"},{"name":"pgsodium.randombytes_new_seed","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_secretbox_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_ietf_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_shorthash_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_generichash_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_kdf_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_kx_new_keypair","return_type":"crypto_kx_keypair","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_kx_new_seed","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_kx_seed_new_keypair","return_type":"crypto_kx_keypair","arguments":"seed bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha256_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_box_new_keypair","return_type":"crypto_box_keypair","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_new_keypair","return_type":"crypto_sign_keypair","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_init","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_update","return_type":"bytea","arguments":"state bytea, message bytea","type":"FUNCTION"},{"name":"pgsodium.randombytes_random","return_type":"int4","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_secretbox_noncegen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_ietf_noncegen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_secretstream_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_stream_xchacha20_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_stream_xchacha20_noncegen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_cmp","return_type":"bool","arguments":"text, text","type":"FUNCTION"},{"name":"pgsodium.crypto_signcrypt_new_keypair","return_type":"crypto_signcrypt_keypair","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_encrypt","return_type":"bytea","arguments":"message bytea, additional bytea, key bytea, nonce bytea DEFAULT NULL::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_decrypt","return_type":"bytea","arguments":"ciphertext bytea, additional bytea, key bytea, nonce bytea DEFAULT NULL::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_encrypt","return_type":"bytea","arguments":"message bytea, additional bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea, nonce bytea DEFAULT NULL::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_decrypt","return_type":"bytea","arguments":"message bytea, additional bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea, nonce bytea DEFAULT NULL::bytea","type":"FUNCTION"},{"name":"pgsodium.version","return_type":"text","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_noncegen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_pwhash_str","return_type":"bytea","arguments":"password bytea","type":"FUNCTION"},{"name":"pgsodium.has_mask","return_type":"bool","arguments":"role regrole, source_name text","type":"FUNCTION"},{"name":"pgsodium.mask_columns","return_type":"record","arguments":"source_relid oid","type":"FUNCTION"},{"name":"pgsodium.create_mask_view","return_type":"void","arguments":"relid oid, debug boolean DEFAULT false","type":"FUNCTION"},{"name":"pgsodium.create_key","return_type":"valid_key","arguments":"key_type pgsodium.key_type DEFAULT 'aead-det'::pgsodium.key_type, name text DEFAULT NULL::text, raw_key bytea DEFAULT NULL::bytea, raw_key_nonce bytea DEFAULT NULL::bytea, parent_key uuid DEFAULT NULL::uuid, key_context bytea DEFAULT '\\x7067736f6469756d'::bytea, expires timestamp with time zone DEFAULT NULL::timestamp with time zone, associated_data text DEFAULT ''::text","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_ietf_decrypt","return_type":"bytea","arguments":"message bytea, additional bytea, nonce bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_pwhash_str_verify","return_type":"bool","arguments":"hashed_password bytea, password bytea","type":"FUNCTION"},{"name":"pgsodium.quote_assoc","return_type":"text","arguments":"text, boolean DEFAULT false","type":"FUNCTION"},{"name":"pgsodium.crypto_shorthash","return_type":"bytea","arguments":"message bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_kdf_derive_from_key","return_type":"bytea","arguments":"subkey_size integer, subkey_id bigint, context bytea, primary_key uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_pwhash","return_type":"bytea","arguments":"password bytea, salt bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_encrypt","return_type":"bytea","arguments":"message bytea, additional bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_decrypt","return_type":"bytea","arguments":"message bytea, additional bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_ietf_encrypt","return_type":"bytea","arguments":"message bytea, additional bytea, nonce bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.get_key_by_id","return_type":"valid_key","arguments":"uuid","type":"FUNCTION"},{"name":"pgsodium.get_key_by_name","return_type":"valid_key","arguments":"text","type":"FUNCTION"},{"name":"pgsodium.get_named_keys","return_type":"valid_key","arguments":"filter text DEFAULT '%'::text","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_ietf_encrypt","return_type":"bytea","arguments":"message bytea, additional bytea, nonce bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.enable_security_label_trigger","return_type":"void","arguments":"","type":"FUNCTION"},{"name":"pgsodium.disable_security_label_trigger","return_type":"void","arguments":"","type":"FUNCTION"},{"name":"pgsodium.update_mask","return_type":"void","arguments":"target oid, debug boolean DEFAULT false","type":"FUNCTION"},{"name":"pgsodium.mask_role","return_type":"void","arguments":"masked_role regrole, source_name text, view_name text","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_update_agg1","return_type":"bytea","arguments":"state bytea, message bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_update_agg2","return_type":"bytea","arguments":"cur_state bytea, initial_state bytea, message bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_update_agg","return_type":"bytea","arguments":"message bytea","type":"a"},{"name":"pgsodium.crypto_sign_update_agg","return_type":"bytea","arguments":"state bytea, message bytea","type":"a"},{"name":"pgsodium.encrypted_columns","return_type":"text","arguments":"relid oid","type":"FUNCTION"},{"name":"pgsodium.decrypted_columns","return_type":"text","arguments":"relid oid","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_ietf_encrypt","return_type":"bytea","arguments":"message bytea, additional bytea, nonce bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_ietf_decrypt","return_type":"bytea","arguments":"message bytea, additional bytea, nonce bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_ietf_decrypt","return_type":"bytea","arguments":"message bytea, additional bytea, nonce bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_auth","return_type":"bytea","arguments":"message bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth","return_type":"bytea","arguments":"message bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth","return_type":"bytea","arguments":"message bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_verify","return_type":"bool","arguments":"mac bytea, message bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_verify","return_type":"bool","arguments":"mac bytea, message bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_verify","return_type":"bool","arguments":"mac bytea, message bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_box_seed_new_keypair","return_type":"crypto_box_keypair","arguments":"seed bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_box","return_type":"bytea","arguments":"message bytea, nonce bytea, public bytea, secret bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_box_open","return_type":"bytea","arguments":"ciphertext bytea, nonce bytea, public bytea, secret bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_box_seal","return_type":"bytea","arguments":"message bytea, public_key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_box_seal_open","return_type":"bytea","arguments":"ciphertext bytea, public_key bytea, secret_key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_generichash","return_type":"bytea","arguments":"message bytea, key bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_generichash","return_type":"bytea","arguments":"message bytea, key bytea DEFAULT NULL::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_generichash","return_type":"bytea","arguments":"message bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_shorthash","return_type":"bytea","arguments":"message bytea, key bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_shorthash","return_type":"bytea","arguments":"message bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.sodium_bin2base64","return_type":"text","arguments":"bin bytea","type":"FUNCTION"},{"name":"pgsodium.sodium_base642bin","return_type":"bytea","arguments":"base64 text","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha512","return_type":"bytea","arguments":"message bytea, secret bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha512","return_type":"bytea","arguments":"message bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha512","return_type":"bytea","arguments":"message bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha512_verify","return_type":"bool","arguments":"hash bytea, message bytea, secret bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha512_verify","return_type":"bool","arguments":"hash bytea, message bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha512_verify","return_type":"bool","arguments":"signature bytea, message bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha256","return_type":"bytea","arguments":"message bytea, secret bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha256","return_type":"bytea","arguments":"message bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha256","return_type":"bytea","arguments":"message bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha256_verify","return_type":"bool","arguments":"hash bytea, message bytea, secret bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha256_verify","return_type":"bool","arguments":"hash bytea, message bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha256_verify","return_type":"bool","arguments":"signature bytea, message bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_kdf_derive_from_key","return_type":"bytea","arguments":"subkey_size bigint, subkey_id bigint, context bytea, primary_key bytea","type":"FUNCTION"},{"name":"pgsodium.randombytes_uniform","return_type":"int4","arguments":"upper_bound integer","type":"FUNCTION"},{"name":"pgsodium.randombytes_buf","return_type":"bytea","arguments":"size integer","type":"FUNCTION"},{"name":"pgsodium.randombytes_buf_deterministic","return_type":"bytea","arguments":"size integer, seed bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_secretbox","return_type":"bytea","arguments":"message bytea, nonce bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_secretbox","return_type":"bytea","arguments":"message bytea, nonce bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_secretbox","return_type":"bytea","arguments":"message bytea, nonce bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_secretbox_open","return_type":"bytea","arguments":"ciphertext bytea, nonce bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_secretbox_open","return_type":"bytea","arguments":"message bytea, nonce bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_secretbox_open","return_type":"bytea","arguments":"message bytea, nonce bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_hash_sha256","return_type":"bytea","arguments":"message bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_hash_sha512","return_type":"bytea","arguments":"message bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_sign","return_type":"bytea","arguments":"message bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_detached","return_type":"bytea","arguments":"message bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_final_create","return_type":"bytea","arguments":"state bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_final_verify","return_type":"bool","arguments":"state bytea, signature bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_open","return_type":"bytea","arguments":"signed_message bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_seed_new_keypair","return_type":"crypto_sign_keypair","arguments":"seed bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_verify_detached","return_type":"bool","arguments":"sig bytea, message bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_signcrypt_sign_after","return_type":"bytea","arguments":"state bytea, sender_sk bytea, ciphertext bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_signcrypt_sign_before","return_type":"crypto_signcrypt_state_key","arguments":"sender bytea, recipient bytea, sender_sk bytea, recipient_pk bytea, additional bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_signcrypt_verify_after","return_type":"bool","arguments":"state bytea, signature bytea, sender_pk bytea, ciphertext bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_signcrypt_verify_before","return_type":"crypto_signcrypt_state_key","arguments":"signature bytea, sender bytea, recipient bytea, additional bytea, sender_pk bytea, recipient_sk bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_signcrypt_verify_public","return_type":"bool","arguments":"signature bytea, sender bytea, recipient bytea, additional bytea, sender_pk bytea, ciphertext bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_stream_xchacha20","return_type":"bytea","arguments":"bigint, bytea, bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_stream_xchacha20","return_type":"bytea","arguments":"bigint, bytea, bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_stream_xchacha20_xor","return_type":"bytea","arguments":"bytea, bytea, bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_stream_xchacha20_xor","return_type":"bytea","arguments":"bytea, bytea, bigint, context bytea DEFAULT '\\x70676f736469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_stream_xchacha20_xor_ic","return_type":"bytea","arguments":"bytea, bytea, bigint, bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_stream_xchacha20_xor_ic","return_type":"bytea","arguments":"bytea, bytea, bigint, bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.encrypted_column","return_type":"text","arguments":"relid oid, m record","type":"FUNCTION"},{"name":"pgsodium.update_masks","return_type":"void","arguments":"debug boolean DEFAULT false","type":"FUNCTION"},{"name":"pgsodium.key_encrypt_secret_raw_key","return_type":"trigger","arguments":"","type":"FUNCTION"},{"name":"pgsodium.trg_mask_update","return_type":"event_trigger","arguments":"","type":"FUNCTION"},{"name":"pgsodium.create_mask_view","return_type":"void","arguments":"relid oid, subid integer, debug boolean DEFAULT false","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_decrypt","return_type":"bytea","arguments":"message bytea, additional bytea, key_uuid uuid, nonce bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_encrypt","return_type":"bytea","arguments":"message bytea, additional bytea, key_uuid uuid, nonce bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"vault.secrets_encrypt_secret_secret","return_type":"trigger","arguments":"","type":"FUNCTION"},{"name":"vault.create_secret","return_type":"uuid","arguments":"new_secret text, new_name text DEFAULT NULL::text, new_description text DEFAULT ''::text, new_key_id uuid DEFAULT NULL::uuid","type":"FUNCTION"},{"name":"vault.update_secret","return_type":"void","arguments":"secret_id uuid, new_secret text DEFAULT NULL::text, new_name text DEFAULT NULL::text, new_description text DEFAULT NULL::text, new_key_id uuid DEFAULT NULL::uuid","type":"FUNCTION"},{"name":"extensions.pgp_pub_decrypt","return_type":"text","arguments":"bytea, bytea, text","type":"FUNCTION"},{"name":"extensions.pgp_pub_decrypt_bytea","return_type":"bytea","arguments":"bytea, bytea, text","type":"FUNCTION"},{"name":"extensions.pgp_pub_decrypt","return_type":"text","arguments":"bytea, bytea, text, text","type":"FUNCTION"},{"name":"extensions.sign","return_type":"text","arguments":"payload json, secret text, algorithm text DEFAULT 'HS256'::text","type":"FUNCTION"},{"name":"extensions.pgp_sym_encrypt","return_type":"bytea","arguments":"text, text","type":"FUNCTION"},{"name":"extensions.pgp_sym_encrypt_bytea","return_type":"bytea","arguments":"bytea, text","type":"FUNCTION"},{"name":"extensions.pgp_sym_encrypt","return_type":"bytea","arguments":"text, text, text","type":"FUNCTION"},{"name":"extensions.pgp_sym_encrypt_bytea","return_type":"bytea","arguments":"bytea, text, text","type":"FUNCTION"},{"name":"extensions.pg_stat_statements_info","return_type":"record","arguments":"OUT dealloc bigint, OUT stats_reset timestamp with time zone","type":"FUNCTION"},{"name":"extensions.pg_stat_statements","return_type":"record","arguments":"showtext boolean, OUT userid oid, OUT dbid oid, OUT toplevel boolean, OUT queryid bigint, OUT query text, OUT plans bigint, OUT total_plan_time double precision, OUT min_plan_time double precision, OUT max_plan_time double precision, OUT mean_plan_time double precision, OUT stddev_plan_time double precision, OUT calls bigint, OUT total_exec_time double precision, OUT min_exec_time double precision, OUT max_exec_time double precision, OUT mean_exec_time double precision, OUT stddev_exec_time double precision, OUT rows bigint, OUT shared_blks_hit bigint, OUT shared_blks_read bigint, OUT shared_blks_dirtied bigint, OUT shared_blks_written bigint, OUT local_blks_hit bigint, OUT local_blks_read bigint, OUT local_blks_dirtied bigint, OUT local_blks_written bigint, OUT temp_blks_read bigint, OUT temp_blks_written bigint, OUT blk_read_time double precision, OUT blk_write_time double precision, OUT temp_blk_read_time double precision, OUT temp_blk_write_time double precision, OUT wal_records bigint, OUT wal_fpi bigint, OUT wal_bytes numeric, OUT jit_functions bigint, OUT jit_generation_time double precision, OUT jit_inlining_count bigint, OUT jit_inlining_time double precision, OUT jit_optimization_count bigint, OUT jit_optimization_time double precision, OUT jit_emission_count bigint, OUT jit_emission_time double precision","type":"FUNCTION"},{"name":"extensions.verify","return_type":"record","arguments":"token text, secret text, algorithm text DEFAULT 'HS256'::text","type":"FUNCTION"},{"name":"extensions.grant_pg_cron_access","return_type":"event_trigger","arguments":"","type":"FUNCTION"},{"name":"extensions.grant_pg_net_access","return_type":"event_trigger","arguments":"","type":"FUNCTION"},{"name":"extensions.pg_stat_statements_reset","return_type":"void","arguments":"userid oid DEFAULT 0, dbid oid DEFAULT 0, queryid bigint DEFAULT 0","type":"FUNCTION"}],"driver":{"name":"postgres","database_version":"PostgreSQL 15.1 (Ubuntu 15.1-1.pgdg20.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0, 64-bit","meta":{"current_schema":"public","search_paths":["\"\\$user\"","public","extensions"],"dict":{"Functions":"Stored procedures and functions"}}}} +{"name":"postgres","desc":"","tables":[{"name":"auth.users","type":"BASE TABLE","comment":"Auth: Stores user login data within a secure schema.","columns":[{"name":"instance_id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"aud","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"role","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"email","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"encrypted_password","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"confirmed_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"invited_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"confirmation_token","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"confirmation_sent_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"recovery_token","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"recovery_sent_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"email_change_token","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"email_change","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"email_change_sent_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"last_sign_in_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"raw_app_meta_data","type":"jsonb","nullable":true,"default":null,"comment":""},{"name":"raw_user_meta_data","type":"jsonb","nullable":true,"default":null,"comment":""},{"name":"is_super_admin","type":"boolean","nullable":true,"default":null,"comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"updated_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""}],"indexes":[{"name":"users_pkey","def":"CREATE UNIQUE INDEX users_pkey ON auth.users USING btree (id)","table":"auth.users","columns":["id"],"comment":""},{"name":"users_email_key","def":"CREATE UNIQUE INDEX users_email_key ON auth.users USING btree (email)","table":"auth.users","columns":["email"],"comment":""},{"name":"users_instance_id_email_idx","def":"CREATE INDEX users_instance_id_email_idx ON auth.users USING btree (instance_id, email)","table":"auth.users","columns":["email","instance_id"],"comment":""},{"name":"users_instance_id_idx","def":"CREATE INDEX users_instance_id_idx ON auth.users USING btree (instance_id)","table":"auth.users","columns":["instance_id"],"comment":""}],"constraints":[{"name":"users_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"auth.users","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""},{"name":"users_email_key","type":"UNIQUE","def":"UNIQUE (email)","table":"auth.users","referenced_table":"","columns":["email"],"referenced_columns":[],"comment":""}],"triggers":[{"name":"on_auth_user_created","def":"CREATE TRIGGER on_auth_user_created AFTER INSERT ON auth.users FOR EACH ROW EXECUTE FUNCTION handle_new_user()","comment":""}],"def":""},{"name":"auth.refresh_tokens","type":"BASE TABLE","comment":"Auth: Store of tokens used to refresh JWT tokens once they expire.","columns":[{"name":"instance_id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"id","type":"bigint","nullable":false,"default":"nextval('auth.refresh_tokens_id_seq'::regclass)","comment":""},{"name":"token","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"user_id","type":"varchar(255)","nullable":true,"default":null,"comment":""},{"name":"revoked","type":"boolean","nullable":true,"default":null,"comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"updated_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""}],"indexes":[{"name":"refresh_tokens_pkey","def":"CREATE UNIQUE INDEX refresh_tokens_pkey ON auth.refresh_tokens USING btree (id)","table":"auth.refresh_tokens","columns":["id"],"comment":""},{"name":"refresh_tokens_instance_id_idx","def":"CREATE INDEX refresh_tokens_instance_id_idx ON auth.refresh_tokens USING btree (instance_id)","table":"auth.refresh_tokens","columns":["instance_id"],"comment":""},{"name":"refresh_tokens_instance_id_user_id_idx","def":"CREATE INDEX refresh_tokens_instance_id_user_id_idx ON auth.refresh_tokens USING btree (instance_id, user_id)","table":"auth.refresh_tokens","columns":["instance_id","user_id"],"comment":""},{"name":"refresh_tokens_token_idx","def":"CREATE INDEX refresh_tokens_token_idx ON auth.refresh_tokens USING btree (token)","table":"auth.refresh_tokens","columns":["token"],"comment":""}],"constraints":[{"name":"refresh_tokens_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"auth.refresh_tokens","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"auth.instances","type":"BASE TABLE","comment":"Auth: Manages users across multiple sites.","columns":[{"name":"id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"uuid","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"raw_base_config","type":"text","nullable":true,"default":null,"comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"updated_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""}],"indexes":[{"name":"instances_pkey","def":"CREATE UNIQUE INDEX instances_pkey ON auth.instances USING btree (id)","table":"auth.instances","columns":["id"],"comment":""}],"constraints":[{"name":"instances_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"auth.instances","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"auth.audit_log_entries","type":"BASE TABLE","comment":"Auth: Audit trail for user actions.","columns":[{"name":"instance_id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"payload","type":"json","nullable":true,"default":null,"comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""}],"indexes":[{"name":"audit_log_entries_pkey","def":"CREATE UNIQUE INDEX audit_log_entries_pkey ON auth.audit_log_entries USING btree (id)","table":"auth.audit_log_entries","columns":["id"],"comment":""},{"name":"audit_logs_instance_id_idx","def":"CREATE INDEX audit_logs_instance_id_idx ON auth.audit_log_entries USING btree (instance_id)","table":"auth.audit_log_entries","columns":["instance_id"],"comment":""}],"constraints":[{"name":"audit_log_entries_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"auth.audit_log_entries","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"auth.schema_migrations","type":"BASE TABLE","comment":"Auth: Manages updates to the auth system.","columns":[{"name":"version","type":"varchar(255)","nullable":false,"default":null,"comment":""}],"indexes":[{"name":"schema_migrations_pkey","def":"CREATE UNIQUE INDEX schema_migrations_pkey ON auth.schema_migrations USING btree (version)","table":"auth.schema_migrations","columns":["version"],"comment":""}],"constraints":[{"name":"schema_migrations_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (version)","table":"auth.schema_migrations","referenced_table":"","columns":["version"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"storage.buckets","type":"BASE TABLE","comment":"","columns":[{"name":"id","type":"text","nullable":false,"default":null,"comment":""},{"name":"name","type":"text","nullable":false,"default":null,"comment":""},{"name":"owner","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":true,"default":"now()","comment":""},{"name":"updated_at","type":"timestamp with time zone","nullable":true,"default":"now()","comment":""}],"indexes":[{"name":"buckets_pkey","def":"CREATE UNIQUE INDEX buckets_pkey ON storage.buckets USING btree (id)","table":"storage.buckets","columns":["id"],"comment":""},{"name":"bname","def":"CREATE UNIQUE INDEX bname ON storage.buckets USING btree (name)","table":"storage.buckets","columns":["name"],"comment":""}],"constraints":[{"name":"buckets_owner_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (owner) REFERENCES auth.users(id)","table":"storage.buckets","referenced_table":"users","columns":["owner"],"referenced_columns":["id"],"comment":""},{"name":"buckets_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"storage.buckets","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"storage.objects","type":"BASE TABLE","comment":"","columns":[{"name":"id","type":"uuid","nullable":false,"default":"uuid_generate_v4()","comment":""},{"name":"bucket_id","type":"text","nullable":true,"default":null,"comment":""},{"name":"name","type":"text","nullable":true,"default":null,"comment":""},{"name":"owner","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":true,"default":"now()","comment":""},{"name":"updated_at","type":"timestamp with time zone","nullable":true,"default":"now()","comment":""},{"name":"last_accessed_at","type":"timestamp with time zone","nullable":true,"default":"now()","comment":""},{"name":"metadata","type":"jsonb","nullable":true,"default":null,"comment":""}],"indexes":[{"name":"objects_pkey","def":"CREATE UNIQUE INDEX objects_pkey ON storage.objects USING btree (id)","table":"storage.objects","columns":["id"],"comment":""},{"name":"bucketid_objname","def":"CREATE UNIQUE INDEX bucketid_objname ON storage.objects USING btree (bucket_id, name)","table":"storage.objects","columns":["bucket_id","name"],"comment":""},{"name":"name_prefix_search","def":"CREATE INDEX name_prefix_search ON storage.objects USING btree (name text_pattern_ops)","table":"storage.objects","columns":["name"],"comment":""}],"constraints":[{"name":"objects_owner_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (owner) REFERENCES auth.users(id)","table":"storage.objects","referenced_table":"users","columns":["owner"],"referenced_columns":["id"],"comment":""},{"name":"objects_bucketId_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (bucket_id) REFERENCES storage.buckets(id)","table":"storage.objects","referenced_table":"buckets","columns":["bucket_id"],"referenced_columns":["id"],"comment":""},{"name":"objects_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"storage.objects","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"storage.migrations","type":"BASE TABLE","comment":"","columns":[{"name":"id","type":"integer","nullable":false,"default":null,"comment":""},{"name":"name","type":"varchar(100)","nullable":false,"default":null,"comment":""},{"name":"hash","type":"varchar(40)","nullable":false,"default":null,"comment":""},{"name":"executed_at","type":"timestamp without time zone","nullable":true,"default":"CURRENT_TIMESTAMP","comment":""}],"indexes":[{"name":"migrations_pkey","def":"CREATE UNIQUE INDEX migrations_pkey ON storage.migrations USING btree (id)","table":"storage.migrations","columns":["id"],"comment":""},{"name":"migrations_name_key","def":"CREATE UNIQUE INDEX migrations_name_key ON storage.migrations USING btree (name)","table":"storage.migrations","columns":["name"],"comment":""}],"constraints":[{"name":"migrations_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"storage.migrations","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""},{"name":"migrations_name_key","type":"UNIQUE","def":"UNIQUE (name)","table":"storage.migrations","referenced_table":"","columns":["name"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"net.http_request_queue","type":"BASE TABLE","comment":"","columns":[{"name":"id","type":"bigint","nullable":false,"default":"nextval('net.http_request_queue_id_seq'::regclass)","comment":""},{"name":"method","type":"net.http_method","nullable":false,"default":null,"comment":""},{"name":"url","type":"text","nullable":false,"default":null,"comment":""},{"name":"headers","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"body","type":"bytea","nullable":true,"default":null,"comment":""},{"name":"timeout_milliseconds","type":"integer","nullable":false,"default":null,"comment":""}],"indexes":[],"constraints":[],"triggers":[],"def":""},{"name":"net._http_response","type":"BASE TABLE","comment":"","columns":[{"name":"id","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"status_code","type":"integer","nullable":true,"default":null,"comment":""},{"name":"content_type","type":"text","nullable":true,"default":null,"comment":""},{"name":"headers","type":"jsonb","nullable":true,"default":null,"comment":""},{"name":"content","type":"text","nullable":true,"default":null,"comment":""},{"name":"timed_out","type":"boolean","nullable":true,"default":null,"comment":""},{"name":"error_msg","type":"text","nullable":true,"default":null,"comment":""},{"name":"created","type":"timestamp with time zone","nullable":false,"default":"now()","comment":""}],"indexes":[{"name":"_http_response_created_idx","def":"CREATE INDEX _http_response_created_idx ON net._http_response USING btree (created)","table":"net._http_response","columns":["created"],"comment":""}],"constraints":[],"triggers":[],"def":""},{"name":"supabase_functions.migrations","type":"BASE TABLE","comment":"","columns":[{"name":"version","type":"text","nullable":false,"default":null,"comment":""},{"name":"inserted_at","type":"timestamp with time zone","nullable":false,"default":"now()","comment":""}],"indexes":[{"name":"migrations_pkey","def":"CREATE UNIQUE INDEX migrations_pkey ON supabase_functions.migrations USING btree (version)","table":"supabase_functions.migrations","columns":["version"],"comment":""}],"constraints":[{"name":"migrations_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (version)","table":"supabase_functions.migrations","referenced_table":"","columns":["version"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"supabase_functions.hooks","type":"BASE TABLE","comment":"Supabase Functions Hooks: Audit trail for triggered hooks.","columns":[{"name":"id","type":"bigint","nullable":false,"default":"nextval('supabase_functions.hooks_id_seq'::regclass)","comment":""},{"name":"hook_table_id","type":"integer","nullable":false,"default":null,"comment":""},{"name":"hook_name","type":"text","nullable":false,"default":null,"comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":false,"default":"now()","comment":""},{"name":"request_id","type":"bigint","nullable":true,"default":null,"comment":""}],"indexes":[{"name":"hooks_pkey","def":"CREATE UNIQUE INDEX hooks_pkey ON supabase_functions.hooks USING btree (id)","table":"supabase_functions.hooks","columns":["id"],"comment":""},{"name":"supabase_functions_hooks_request_id_idx","def":"CREATE INDEX supabase_functions_hooks_request_id_idx ON supabase_functions.hooks USING btree (request_id)","table":"supabase_functions.hooks","columns":["request_id"],"comment":""},{"name":"supabase_functions_hooks_h_table_id_h_name_idx","def":"CREATE INDEX supabase_functions_hooks_h_table_id_h_name_idx ON supabase_functions.hooks USING btree (hook_table_id, hook_name)","table":"supabase_functions.hooks","columns":["hook_name","hook_table_id"],"comment":""}],"constraints":[{"name":"hooks_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"supabase_functions.hooks","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"public.study","type":"BASE TABLE","comment":"","columns":[{"name":"id","type":"uuid","nullable":false,"default":"gen_random_uuid()","comment":""},{"name":"contact","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"title","type":"text","nullable":false,"default":null,"comment":""},{"name":"description","type":"text","nullable":false,"default":null,"comment":""},{"name":"icon_name","type":"text","nullable":false,"default":null,"comment":""},{"name":"published","type":"boolean","nullable":false,"default":"false","comment":""},{"name":"registry_published","type":"boolean","nullable":false,"default":"false","comment":""},{"name":"questionnaire","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"eligibility_criteria","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"observations","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"interventions","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"consent","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"schedule","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"report_specification","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"results","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":false,"default":"now()","comment":""},{"name":"updated_at","type":"timestamp with time zone","nullable":false,"default":"now()","comment":""},{"name":"user_id","type":"uuid","nullable":false,"default":null,"comment":"UserId of study creator"},{"name":"participation","type":"participation","nullable":false,"default":"'invite'::participation","comment":""},{"name":"result_sharing","type":"result_sharing","nullable":false,"default":"'private'::result_sharing","comment":""},{"name":"collaborator_emails","type":"text[]","nullable":false,"default":"'{}'::text[]","comment":""}],"indexes":[{"name":"study_id_key","def":"CREATE UNIQUE INDEX study_id_key ON public.study USING btree (id)","table":"public.study","columns":["id"],"comment":""},{"name":"study_pkey","def":"CREATE UNIQUE INDEX study_pkey ON public.study USING btree (id)","table":"public.study","columns":["id"],"comment":""}],"constraints":[{"name":"study_id_key","type":"UNIQUE","def":"UNIQUE (id)","table":"public.study","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""},{"name":"study_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"public.study","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""},{"name":"study_userId_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (user_id) REFERENCES \"user\"(id)","table":"public.study","referenced_table":"user","columns":["user_id"],"referenced_columns":["id"],"comment":""}],"triggers":[{"name":"handle_updated_at","def":"CREATE TRIGGER handle_updated_at BEFORE UPDATE ON public.study FOR EACH ROW EXECUTE FUNCTION moddatetime('updated_at')","comment":""}],"def":""},{"name":"public.study_subject","type":"BASE TABLE","comment":"","columns":[{"name":"id","type":"uuid","nullable":false,"default":"gen_random_uuid()","comment":""},{"name":"study_id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"user_id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"started_at","type":"timestamp with time zone","nullable":true,"default":"now()","comment":""},{"name":"selected_intervention_ids","type":"text[]","nullable":false,"default":null,"comment":""},{"name":"invite_code","type":"text","nullable":true,"default":null,"comment":""},{"name":"is_deleted","type":"boolean","nullable":false,"default":"false","comment":""}],"indexes":[{"name":"study_subject_pkey","def":"CREATE UNIQUE INDEX study_subject_pkey ON public.study_subject USING btree (id)","table":"public.study_subject","columns":["id"],"comment":""}],"constraints":[{"name":"study_subject_studyId_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE","table":"public.study_subject","referenced_table":"study","columns":["study_id"],"referenced_columns":["id"],"comment":""},{"name":"study_subject_loginCode_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (invite_code) REFERENCES study_invite(code) ON DELETE CASCADE","table":"public.study_subject","referenced_table":"study_invite","columns":["invite_code"],"referenced_columns":["code"],"comment":""},{"name":"study_subject_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"public.study_subject","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""},{"name":"study_subject_userId_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (user_id) REFERENCES \"user\"(id)","table":"public.study_subject","referenced_table":"user","columns":["user_id"],"referenced_columns":["id"],"comment":""}],"triggers":[],"def":""},{"name":"public.app_config","type":"BASE TABLE","comment":"Stores app config for different envs","columns":[{"name":"id","type":"text","nullable":false,"default":null,"comment":""},{"name":"app_privacy","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"app_terms","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"designer_privacy","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"designer_terms","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"imprint","type":"jsonb","nullable":false,"default":null,"comment":""},{"name":"contact","type":"jsonb","nullable":false,"default":"'{\"email\": \"hpi-info@hpi.de\", \"phone\": \"+49-(0)331 5509-0\", \"website\": \"https://hpi.de/\", \"organization\": \"Hasso Plattner Institute\"}'::jsonb","comment":""},{"name":"analytics","type":"jsonb","nullable":true,"default":null,"comment":""}],"indexes":[{"name":"AppConfig_pkey","def":"CREATE UNIQUE INDEX \"AppConfig_pkey\" ON public.app_config USING btree (id)","table":"public.app_config","columns":["id"],"comment":""}],"constraints":[{"name":"AppConfig_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"public.app_config","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"public.repo","type":"BASE TABLE","comment":"Git repo where the generated project is stored","columns":[{"name":"project_id","type":"text","nullable":false,"default":null,"comment":""},{"name":"user_id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"study_id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"provider","type":"git_provider","nullable":false,"default":null,"comment":""}],"indexes":[{"name":"repo_pkey","def":"CREATE UNIQUE INDEX repo_pkey ON public.repo USING btree (project_id)","table":"public.repo","columns":["project_id"],"comment":""}],"constraints":[{"name":"repo_studyId_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (study_id) REFERENCES study(id)","table":"public.repo","referenced_table":"study","columns":["study_id"],"referenced_columns":["id"],"comment":""},{"name":"repo_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (project_id)","table":"public.repo","referenced_table":"","columns":["project_id"],"referenced_columns":[],"comment":""},{"name":"repo_userId_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (user_id) REFERENCES \"user\"(id) ON DELETE CASCADE","table":"public.repo","referenced_table":"user","columns":["user_id"],"referenced_columns":["id"],"comment":""}],"triggers":[],"def":""},{"name":"public.study_invite","type":"BASE TABLE","comment":"Study invite codes","columns":[{"name":"code","type":"text","nullable":false,"default":null,"comment":""},{"name":"study_id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"preselected_intervention_ids","type":"text[]","nullable":true,"default":null,"comment":"Intervention Ids (and order) preselected by study creator"}],"indexes":[{"name":"study_invite_pkey","def":"CREATE UNIQUE INDEX study_invite_pkey ON public.study_invite USING btree (code)","table":"public.study_invite","columns":["code"],"comment":""}],"constraints":[{"name":"study_invite_studyId_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE","table":"public.study_invite","referenced_table":"study","columns":["study_id"],"referenced_columns":["id"],"comment":""},{"name":"study_invite_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (code)","table":"public.study_invite","referenced_table":"","columns":["code"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"public.subject_progress","type":"BASE TABLE","comment":"","columns":[{"name":"completed_at","type":"timestamp with time zone","nullable":false,"default":"timezone('utc'::text, now())","comment":""},{"name":"subject_id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"intervention_id","type":"text","nullable":false,"default":null,"comment":""},{"name":"task_id","type":"text","nullable":false,"default":null,"comment":""},{"name":"result_type","type":"text","nullable":false,"default":null,"comment":""},{"name":"result","type":"jsonb","nullable":false,"default":null,"comment":""}],"indexes":[{"name":"participant_progress_pkey","def":"CREATE UNIQUE INDEX participant_progress_pkey ON public.subject_progress USING btree (completed_at, subject_id)","table":"public.subject_progress","columns":["completed_at","subject_id"],"comment":""}],"constraints":[{"name":"participant_progress_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (completed_at, subject_id)","table":"public.subject_progress","referenced_table":"","columns":["completed_at","subject_id"],"referenced_columns":[],"comment":""},{"name":"participant_progress_subjectId_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (subject_id) REFERENCES study_subject(id) ON DELETE CASCADE","table":"public.subject_progress","referenced_table":"study_subject","columns":["subject_id"],"referenced_columns":["id"],"comment":""}],"triggers":[],"def":""},{"name":"public.study_progress_export","type":"VIEW","comment":"","columns":[{"name":"completed_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"intervention_id","type":"text","nullable":true,"default":null,"comment":""},{"name":"task_id","type":"text","nullable":true,"default":null,"comment":""},{"name":"result_type","type":"text","nullable":true,"default":null,"comment":""},{"name":"result","type":"jsonb","nullable":true,"default":null,"comment":""},{"name":"subject_id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"user_id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"study_id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"started_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"selected_intervention_ids","type":"text[]","nullable":true,"default":null,"comment":""}],"indexes":[],"constraints":[],"triggers":[],"def":"CREATE VIEW study_progress_export AS (\n SELECT subject_progress.completed_at,\n subject_progress.intervention_id,\n subject_progress.task_id,\n subject_progress.result_type,\n subject_progress.result,\n subject_progress.subject_id,\n study_subject.user_id,\n study_subject.study_id,\n study_subject.started_at,\n study_subject.selected_intervention_ids\n FROM study_subject,\n subject_progress\n WHERE (study_subject.id = subject_progress.subject_id)\n)","referenced_tables":["public.study_subject"]},{"name":"public.user","type":"BASE TABLE","comment":"Users get automatically added, when a new user is created in auth.users","columns":[{"name":"id","type":"uuid","nullable":false,"default":null,"comment":""},{"name":"email","type":"text","nullable":true,"default":null,"comment":""},{"name":"preferences","type":"jsonb","nullable":true,"default":null,"comment":""}],"indexes":[{"name":"user_pkey","def":"CREATE UNIQUE INDEX user_pkey ON public.\"user\" USING btree (id)","table":"public.user","columns":["id"],"comment":""}],"constraints":[{"name":"user_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"public.user","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""}],"triggers":[],"def":""},{"name":"extensions.pg_stat_statements_info","type":"VIEW","comment":"","columns":[{"name":"dealloc","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"stats_reset","type":"timestamp with time zone","nullable":true,"default":null,"comment":""}],"indexes":[],"constraints":[],"triggers":[],"def":"CREATE VIEW pg_stat_statements_info AS (\n SELECT pg_stat_statements_info.dealloc,\n pg_stat_statements_info.stats_reset\n FROM pg_stat_statements_info() pg_stat_statements_info(dealloc, stats_reset)\n)","referenced_tables":["pg_stat_statements_info"]},{"name":"extensions.pg_stat_statements","type":"VIEW","comment":"","columns":[{"name":"userid","type":"oid","nullable":true,"default":null,"comment":""},{"name":"dbid","type":"oid","nullable":true,"default":null,"comment":""},{"name":"toplevel","type":"boolean","nullable":true,"default":null,"comment":""},{"name":"queryid","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"query","type":"text","nullable":true,"default":null,"comment":""},{"name":"plans","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"total_plan_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"min_plan_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"max_plan_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"mean_plan_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"stddev_plan_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"calls","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"total_exec_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"min_exec_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"max_exec_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"mean_exec_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"stddev_exec_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"rows","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"shared_blks_hit","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"shared_blks_read","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"shared_blks_dirtied","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"shared_blks_written","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"local_blks_hit","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"local_blks_read","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"local_blks_dirtied","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"local_blks_written","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"temp_blks_read","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"temp_blks_written","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"blk_read_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"blk_write_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"temp_blk_read_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"temp_blk_write_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"wal_records","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"wal_fpi","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"wal_bytes","type":"numeric","nullable":true,"default":null,"comment":""},{"name":"jit_functions","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"jit_generation_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"jit_inlining_count","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"jit_inlining_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"jit_optimization_count","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"jit_optimization_time","type":"double precision","nullable":true,"default":null,"comment":""},{"name":"jit_emission_count","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"jit_emission_time","type":"double precision","nullable":true,"default":null,"comment":""}],"indexes":[],"constraints":[],"triggers":[],"def":"CREATE VIEW pg_stat_statements AS (\n SELECT pg_stat_statements.userid,\n pg_stat_statements.dbid,\n pg_stat_statements.toplevel,\n pg_stat_statements.queryid,\n pg_stat_statements.query,\n pg_stat_statements.plans,\n pg_stat_statements.total_plan_time,\n pg_stat_statements.min_plan_time,\n pg_stat_statements.max_plan_time,\n pg_stat_statements.mean_plan_time,\n pg_stat_statements.stddev_plan_time,\n pg_stat_statements.calls,\n pg_stat_statements.total_exec_time,\n pg_stat_statements.min_exec_time,\n pg_stat_statements.max_exec_time,\n pg_stat_statements.mean_exec_time,\n pg_stat_statements.stddev_exec_time,\n pg_stat_statements.rows,\n pg_stat_statements.shared_blks_hit,\n pg_stat_statements.shared_blks_read,\n pg_stat_statements.shared_blks_dirtied,\n pg_stat_statements.shared_blks_written,\n pg_stat_statements.local_blks_hit,\n pg_stat_statements.local_blks_read,\n pg_stat_statements.local_blks_dirtied,\n pg_stat_statements.local_blks_written,\n pg_stat_statements.temp_blks_read,\n pg_stat_statements.temp_blks_written,\n pg_stat_statements.blk_read_time,\n pg_stat_statements.blk_write_time,\n pg_stat_statements.temp_blk_read_time,\n pg_stat_statements.temp_blk_write_time,\n pg_stat_statements.wal_records,\n pg_stat_statements.wal_fpi,\n pg_stat_statements.wal_bytes,\n pg_stat_statements.jit_functions,\n pg_stat_statements.jit_generation_time,\n pg_stat_statements.jit_inlining_count,\n pg_stat_statements.jit_inlining_time,\n pg_stat_statements.jit_optimization_count,\n pg_stat_statements.jit_optimization_time,\n pg_stat_statements.jit_emission_count,\n pg_stat_statements.jit_emission_time\n FROM pg_stat_statements(true) pg_stat_statements(userid, dbid, toplevel, queryid, query, plans, total_plan_time, min_plan_time, max_plan_time, mean_plan_time, stddev_plan_time, calls, total_exec_time, min_exec_time, max_exec_time, mean_exec_time, stddev_exec_time, rows, shared_blks_hit, shared_blks_read, shared_blks_dirtied, shared_blks_written, local_blks_hit, local_blks_read, local_blks_dirtied, local_blks_written, temp_blks_read, temp_blks_written, blk_read_time, blk_write_time, temp_blk_read_time, temp_blk_write_time, wal_records, wal_fpi, wal_bytes, jit_functions, jit_generation_time, jit_inlining_count, jit_inlining_time, jit_optimization_count, jit_optimization_time, jit_emission_count, jit_emission_time)\n)","referenced_tables":["pg_stat_statements"]},{"name":"pgsodium.key","type":"BASE TABLE","comment":"This table holds metadata for derived keys given a key_id and key_context. The raw key is never stored.","columns":[{"name":"id","type":"uuid","nullable":false,"default":"gen_random_uuid()","comment":""},{"name":"status","type":"pgsodium.key_status","nullable":true,"default":"'valid'::pgsodium.key_status","comment":""},{"name":"created","type":"timestamp with time zone","nullable":false,"default":"CURRENT_TIMESTAMP","comment":""},{"name":"expires","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"key_type","type":"pgsodium.key_type","nullable":true,"default":null,"comment":""},{"name":"key_id","type":"bigint","nullable":true,"default":"nextval('pgsodium.key_key_id_seq'::regclass)","comment":""},{"name":"key_context","type":"bytea","nullable":true,"default":"'\\x7067736f6469756d'::bytea","comment":""},{"name":"name","type":"text","nullable":true,"default":null,"comment":""},{"name":"associated_data","type":"text","nullable":true,"default":"'associated'::text","comment":""},{"name":"raw_key","type":"bytea","nullable":true,"default":null,"comment":""},{"name":"raw_key_nonce","type":"bytea","nullable":true,"default":null,"comment":""},{"name":"parent_key","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"comment","type":"text","nullable":true,"default":null,"comment":""},{"name":"user_data","type":"text","nullable":true,"default":null,"comment":""}],"indexes":[{"name":"key_pkey","def":"CREATE UNIQUE INDEX key_pkey ON pgsodium.key USING btree (id)","table":"pgsodium.key","columns":["id"],"comment":""},{"name":"key_status_idx","def":"CREATE INDEX key_status_idx ON pgsodium.key USING btree (status) WHERE (status = ANY (ARRAY['valid'::pgsodium.key_status, 'default'::pgsodium.key_status]))","table":"pgsodium.key","columns":["status"],"comment":""},{"name":"key_status_idx1","def":"CREATE UNIQUE INDEX key_status_idx1 ON pgsodium.key USING btree (status) WHERE (status = 'default'::pgsodium.key_status)","table":"pgsodium.key","columns":["status"],"comment":""},{"name":"key_key_id_key_context_key_type_idx","def":"CREATE UNIQUE INDEX key_key_id_key_context_key_type_idx ON pgsodium.key USING btree (key_id, key_context, key_type)","table":"pgsodium.key","columns":["key_context","key_id","key_type"],"comment":""},{"name":"pgsodium_key_unique_name","def":"CREATE UNIQUE INDEX pgsodium_key_unique_name ON pgsodium.key USING btree (name)","table":"pgsodium.key","columns":["name"],"comment":""}],"constraints":[{"name":"key_key_context_check","type":"CHECK","def":"CHECK ((length(key_context) = 8))","table":"pgsodium.key","referenced_table":"","columns":["key_context"],"referenced_columns":[],"comment":""},{"name":"pgsodium_raw","type":"CHECK","def":"CHECK (\nCASE\n WHEN (raw_key IS NOT NULL) THEN ((key_id IS NULL) AND (key_context IS NULL) AND (parent_key IS NOT NULL))\n ELSE ((key_id IS NOT NULL) AND (key_context IS NOT NULL) AND (parent_key IS NULL))\nEND)","table":"pgsodium.key","referenced_table":"","columns":["key_id","key_context","raw_key","parent_key"],"referenced_columns":[],"comment":""},{"name":"key_parent_key_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (parent_key) REFERENCES pgsodium.key(id)","table":"pgsodium.key","referenced_table":"key","columns":["parent_key"],"referenced_columns":["id"],"comment":""},{"name":"key_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"pgsodium.key","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""},{"name":"pgsodium_key_unique_name","type":"UNIQUE","def":"UNIQUE (name)","table":"pgsodium.key","referenced_table":"","columns":["name"],"referenced_columns":[],"comment":""}],"triggers":[{"name":"key_encrypt_secret_trigger_raw_key","def":"CREATE TRIGGER key_encrypt_secret_trigger_raw_key BEFORE INSERT OR UPDATE OF raw_key ON pgsodium.key FOR EACH ROW EXECUTE FUNCTION pgsodium.key_encrypt_secret_raw_key()","comment":""}],"def":""},{"name":"pgsodium.valid_key","type":"VIEW","comment":"","columns":[{"name":"id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"name","type":"text","nullable":true,"default":null,"comment":""},{"name":"status","type":"pgsodium.key_status","nullable":true,"default":null,"comment":""},{"name":"key_type","type":"pgsodium.key_type","nullable":true,"default":null,"comment":""},{"name":"key_id","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"key_context","type":"bytea","nullable":true,"default":null,"comment":""},{"name":"created","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"expires","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"associated_data","type":"text","nullable":true,"default":null,"comment":""}],"indexes":[],"constraints":[],"triggers":[],"def":"CREATE VIEW valid_key AS (\n SELECT key.id,\n key.name,\n key.status,\n key.key_type,\n key.key_id,\n key.key_context,\n key.created,\n key.expires,\n key.associated_data\n FROM pgsodium.key\n WHERE ((key.status = ANY (ARRAY['valid'::pgsodium.key_status, 'default'::pgsodium.key_status])) AND\n CASE\n WHEN (key.expires IS NULL) THEN true\n ELSE (key.expires \u003e now())\n END)\n)","referenced_tables":["pgsodium.key"]},{"name":"pgsodium.masking_rule","type":"VIEW","comment":"","columns":[{"name":"attrelid","type":"oid","nullable":true,"default":null,"comment":""},{"name":"attnum","type":"integer","nullable":true,"default":null,"comment":""},{"name":"relnamespace","type":"regnamespace","nullable":true,"default":null,"comment":""},{"name":"relname","type":"name","nullable":true,"default":null,"comment":""},{"name":"attname","type":"name","nullable":true,"default":null,"comment":""},{"name":"format_type","type":"text","nullable":true,"default":null,"comment":""},{"name":"col_description","type":"text","nullable":true,"default":null,"comment":""},{"name":"key_id_column","type":"text","nullable":true,"default":null,"comment":""},{"name":"key_id","type":"text","nullable":true,"default":null,"comment":""},{"name":"associated_columns","type":"text","nullable":true,"default":null,"comment":""},{"name":"nonce_column","type":"text","nullable":true,"default":null,"comment":""},{"name":"view_name","type":"text","nullable":true,"default":null,"comment":""},{"name":"priority","type":"integer","nullable":true,"default":null,"comment":""}],"indexes":[],"constraints":[],"triggers":[],"def":"CREATE VIEW masking_rule AS (\n WITH const AS (\n SELECT 'encrypt +with +key +id +([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})'::text AS pattern_key_id,\n 'encrypt +with +key +column +([\\w\\\"\\-$]+)'::text AS pattern_key_id_column,\n '(?\u003c=associated) +\\(([\\w\\\"\\-$, ]+)\\)'::text AS pattern_associated_columns,\n '(?\u003c=nonce) +([\\w\\\"\\-$]+)'::text AS pattern_nonce_column,\n '(?\u003c=decrypt with view) +([\\w\\\"\\-$]+\\.[\\w\\\"\\-$]+)'::text AS pattern_view_name\n ), rules_from_seclabels AS (\n SELECT sl.objoid AS attrelid,\n sl.objsubid AS attnum,\n (c.relnamespace)::regnamespace AS relnamespace,\n c.relname,\n a.attname,\n format_type(a.atttypid, a.atttypmod) AS format_type,\n sl.label AS col_description,\n (regexp_match(sl.label, k.pattern_key_id_column, 'i'::text))[1] AS key_id_column,\n (regexp_match(sl.label, k.pattern_key_id, 'i'::text))[1] AS key_id,\n (regexp_match(sl.label, k.pattern_associated_columns, 'i'::text))[1] AS associated_columns,\n (regexp_match(sl.label, k.pattern_nonce_column, 'i'::text))[1] AS nonce_column,\n COALESCE((regexp_match(sl2.label, k.pattern_view_name, 'i'::text))[1], (((c.relnamespace)::regnamespace || '.'::text) || quote_ident(('decrypted_'::text || (c.relname)::text)))) AS view_name,\n 100 AS priority\n FROM const k,\n (((pg_seclabel sl\n JOIN pg_class c ON (((sl.classoid = c.tableoid) AND (sl.objoid = c.oid))))\n JOIN pg_attribute a ON (((a.attrelid = c.oid) AND (sl.objsubid = a.attnum))))\n LEFT JOIN pg_seclabel sl2 ON (((sl2.objoid = c.oid) AND (sl2.objsubid = 0))))\n WHERE ((a.attnum \u003e 0) AND (((c.relnamespace)::regnamespace)::oid \u003c\u003e ('pg_catalog'::regnamespace)::oid) AND (NOT a.attisdropped) AND (sl.label ~~* 'ENCRYPT%'::text) AND (sl.provider = 'pgsodium'::text))\n )\n SELECT DISTINCT ON (rules_from_seclabels.attrelid, rules_from_seclabels.attnum) rules_from_seclabels.attrelid,\n rules_from_seclabels.attnum,\n rules_from_seclabels.relnamespace,\n rules_from_seclabels.relname,\n rules_from_seclabels.attname,\n rules_from_seclabels.format_type,\n rules_from_seclabels.col_description,\n rules_from_seclabels.key_id_column,\n rules_from_seclabels.key_id,\n rules_from_seclabels.associated_columns,\n rules_from_seclabels.nonce_column,\n rules_from_seclabels.view_name,\n rules_from_seclabels.priority\n FROM rules_from_seclabels\n ORDER BY rules_from_seclabels.attrelid, rules_from_seclabels.attnum, rules_from_seclabels.priority DESC\n)"},{"name":"pgsodium.mask_columns","type":"VIEW","comment":"","columns":[{"name":"attname","type":"name","nullable":true,"default":null,"comment":""},{"name":"attrelid","type":"oid","nullable":true,"default":null,"comment":""},{"name":"key_id","type":"text","nullable":true,"default":null,"comment":""},{"name":"key_id_column","type":"text","nullable":true,"default":null,"comment":""},{"name":"associated_columns","type":"text","nullable":true,"default":null,"comment":""},{"name":"nonce_column","type":"text","nullable":true,"default":null,"comment":""},{"name":"format_type","type":"text","nullable":true,"default":null,"comment":""}],"indexes":[],"constraints":[],"triggers":[],"def":"CREATE VIEW mask_columns AS (\n SELECT a.attname,\n a.attrelid,\n m.key_id,\n m.key_id_column,\n m.associated_columns,\n m.nonce_column,\n m.format_type\n FROM (pg_attribute a\n LEFT JOIN pgsodium.masking_rule m ON (((m.attrelid = a.attrelid) AND (m.attname = a.attname))))\n WHERE ((a.attnum \u003e 0) AND (NOT a.attisdropped))\n ORDER BY a.attnum\n)","referenced_tables":["pg_attribute","pgsodium.masking_rule"]},{"name":"pgsodium.decrypted_key","type":"VIEW","comment":"","columns":[{"name":"id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"status","type":"pgsodium.key_status","nullable":true,"default":null,"comment":""},{"name":"created","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"expires","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"key_type","type":"pgsodium.key_type","nullable":true,"default":null,"comment":""},{"name":"key_id","type":"bigint","nullable":true,"default":null,"comment":""},{"name":"key_context","type":"bytea","nullable":true,"default":null,"comment":""},{"name":"name","type":"text","nullable":true,"default":null,"comment":""},{"name":"associated_data","type":"text","nullable":true,"default":null,"comment":""},{"name":"raw_key","type":"bytea","nullable":true,"default":null,"comment":""},{"name":"decrypted_raw_key","type":"bytea","nullable":true,"default":null,"comment":""},{"name":"raw_key_nonce","type":"bytea","nullable":true,"default":null,"comment":""},{"name":"parent_key","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"comment","type":"text","nullable":true,"default":null,"comment":""}],"indexes":[],"constraints":[],"triggers":[],"def":"CREATE VIEW decrypted_key AS (\n SELECT key.id,\n key.status,\n key.created,\n key.expires,\n key.key_type,\n key.key_id,\n key.key_context,\n key.name,\n key.associated_data,\n key.raw_key,\n CASE\n WHEN (key.raw_key IS NULL) THEN NULL::bytea\n ELSE\n CASE\n WHEN (key.parent_key IS NULL) THEN NULL::bytea\n ELSE pgsodium.crypto_aead_det_decrypt(key.raw_key, convert_to(((key.id)::text || key.associated_data), 'utf8'::name), key.parent_key, key.raw_key_nonce)\n END\n END AS decrypted_raw_key,\n key.raw_key_nonce,\n key.parent_key,\n key.comment\n FROM pgsodium.key\n)","referenced_tables":["pgsodium.key"]},{"name":"vault.secrets","type":"BASE TABLE","comment":"Table with encrypted `secret` column for storing sensitive information on disk.","columns":[{"name":"id","type":"uuid","nullable":false,"default":"gen_random_uuid()","comment":""},{"name":"name","type":"text","nullable":true,"default":null,"comment":""},{"name":"description","type":"text","nullable":false,"default":"''::text","comment":""},{"name":"secret","type":"text","nullable":false,"default":null,"comment":""},{"name":"key_id","type":"uuid","nullable":true,"default":"(pgsodium.create_key()).id","comment":""},{"name":"nonce","type":"bytea","nullable":true,"default":"pgsodium.crypto_aead_det_noncegen()","comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":false,"default":"CURRENT_TIMESTAMP","comment":""},{"name":"updated_at","type":"timestamp with time zone","nullable":false,"default":"CURRENT_TIMESTAMP","comment":""}],"indexes":[{"name":"secrets_pkey","def":"CREATE UNIQUE INDEX secrets_pkey ON vault.secrets USING btree (id)","table":"vault.secrets","columns":["id"],"comment":""},{"name":"secrets_name_idx","def":"CREATE UNIQUE INDEX secrets_name_idx ON vault.secrets USING btree (name) WHERE (name IS NOT NULL)","table":"vault.secrets","columns":["name"],"comment":""}],"constraints":[{"name":"secrets_key_id_fkey","type":"FOREIGN KEY","def":"FOREIGN KEY (key_id) REFERENCES pgsodium.key(id)","table":"vault.secrets","referenced_table":"key","columns":["key_id"],"referenced_columns":["id"],"comment":""},{"name":"secrets_pkey","type":"PRIMARY KEY","def":"PRIMARY KEY (id)","table":"vault.secrets","referenced_table":"","columns":["id"],"referenced_columns":[],"comment":""}],"triggers":[{"name":"secrets_encrypt_secret_trigger_secret","def":"CREATE TRIGGER secrets_encrypt_secret_trigger_secret BEFORE INSERT OR UPDATE OF secret ON vault.secrets FOR EACH ROW EXECUTE FUNCTION vault.secrets_encrypt_secret_secret()","comment":""}],"def":""},{"name":"vault.decrypted_secrets","type":"VIEW","comment":"","columns":[{"name":"id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"name","type":"text","nullable":true,"default":null,"comment":""},{"name":"description","type":"text","nullable":true,"default":null,"comment":""},{"name":"secret","type":"text","nullable":true,"default":null,"comment":""},{"name":"decrypted_secret","type":"text","nullable":true,"default":null,"comment":""},{"name":"key_id","type":"uuid","nullable":true,"default":null,"comment":""},{"name":"nonce","type":"bytea","nullable":true,"default":null,"comment":""},{"name":"created_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""},{"name":"updated_at","type":"timestamp with time zone","nullable":true,"default":null,"comment":""}],"indexes":[],"constraints":[],"triggers":[],"def":"CREATE VIEW decrypted_secrets AS (\n SELECT secrets.id,\n secrets.name,\n secrets.description,\n secrets.secret,\n CASE\n WHEN (secrets.secret IS NULL) THEN NULL::text\n ELSE\n CASE\n WHEN (secrets.key_id IS NULL) THEN NULL::text\n ELSE convert_from(pgsodium.crypto_aead_det_decrypt(decode(secrets.secret, 'base64'::text), convert_to(((((secrets.id)::text || secrets.description) || (secrets.created_at)::text) || (secrets.updated_at)::text), 'utf8'::name), secrets.key_id, secrets.nonce), 'utf8'::name)\n END\n END AS decrypted_secret,\n secrets.key_id,\n secrets.nonce,\n secrets.created_at,\n secrets.updated_at\n FROM vault.secrets\n)","referenced_tables":["vault.secrets"]}],"relations":[{"table":"storage.buckets","columns":["owner"],"cardinality":"Zero or more","parent_table":"auth.users","parent_columns":["id"],"parent_cardinality":"Zero or one","def":"FOREIGN KEY (owner) REFERENCES auth.users(id)","virtual":false},{"table":"storage.objects","columns":["owner"],"cardinality":"Zero or more","parent_table":"auth.users","parent_columns":["id"],"parent_cardinality":"Zero or one","def":"FOREIGN KEY (owner) REFERENCES auth.users(id)","virtual":false},{"table":"storage.objects","columns":["bucket_id"],"cardinality":"Zero or more","parent_table":"storage.buckets","parent_columns":["id"],"parent_cardinality":"Zero or one","def":"FOREIGN KEY (bucket_id) REFERENCES storage.buckets(id)","virtual":false},{"table":"public.study","columns":["user_id"],"cardinality":"Zero or more","parent_table":"public.user","parent_columns":["id"],"parent_cardinality":"Exactly one","def":"FOREIGN KEY (user_id) REFERENCES \"user\"(id)","virtual":false},{"table":"public.study_subject","columns":["study_id"],"cardinality":"Zero or more","parent_table":"public.study","parent_columns":["id"],"parent_cardinality":"Exactly one","def":"FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE","virtual":false},{"table":"public.study_subject","columns":["invite_code"],"cardinality":"Zero or more","parent_table":"public.study_invite","parent_columns":["code"],"parent_cardinality":"Zero or one","def":"FOREIGN KEY (invite_code) REFERENCES study_invite(code) ON DELETE CASCADE","virtual":false},{"table":"public.study_subject","columns":["user_id"],"cardinality":"Zero or more","parent_table":"public.user","parent_columns":["id"],"parent_cardinality":"Exactly one","def":"FOREIGN KEY (user_id) REFERENCES \"user\"(id)","virtual":false},{"table":"public.repo","columns":["study_id"],"cardinality":"Zero or more","parent_table":"public.study","parent_columns":["id"],"parent_cardinality":"Exactly one","def":"FOREIGN KEY (study_id) REFERENCES study(id)","virtual":false},{"table":"public.repo","columns":["user_id"],"cardinality":"Zero or more","parent_table":"public.user","parent_columns":["id"],"parent_cardinality":"Exactly one","def":"FOREIGN KEY (user_id) REFERENCES \"user\"(id) ON DELETE CASCADE","virtual":false},{"table":"public.study_invite","columns":["study_id"],"cardinality":"Zero or more","parent_table":"public.study","parent_columns":["id"],"parent_cardinality":"Exactly one","def":"FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE","virtual":false},{"table":"public.subject_progress","columns":["subject_id"],"cardinality":"Zero or more","parent_table":"public.study_subject","parent_columns":["id"],"parent_cardinality":"Exactly one","def":"FOREIGN KEY (subject_id) REFERENCES study_subject(id) ON DELETE CASCADE","virtual":false},{"table":"pgsodium.key","columns":["parent_key"],"cardinality":"Zero or more","parent_table":"pgsodium.key","parent_columns":["id"],"parent_cardinality":"Zero or one","def":"FOREIGN KEY (parent_key) REFERENCES pgsodium.key(id)","virtual":false},{"table":"vault.secrets","columns":["key_id"],"cardinality":"Zero or more","parent_table":"pgsodium.key","parent_columns":["id"],"parent_cardinality":"Zero or one","def":"FOREIGN KEY (key_id) REFERENCES pgsodium.key(id)","virtual":false}],"functions":[{"name":"pgsodium.crypto_box_noncegen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"extensions.uuid_generate_v4","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"pgbouncer.get_auth","return_type":"record","arguments":"p_usename text","type":"FUNCTION"},{"name":"storage.filename","return_type":"text","arguments":"name text","type":"FUNCTION"},{"name":"extensions.digest","return_type":"bytea","arguments":"text, text","type":"FUNCTION"},{"name":"storage.foldername","return_type":"_text","arguments":"name text","type":"FUNCTION"},{"name":"extensions.decrypt_iv","return_type":"bytea","arguments":"bytea, bytea, bytea, text","type":"FUNCTION"},{"name":"storage.extension","return_type":"text","arguments":"name text","type":"FUNCTION"},{"name":"extensions.gen_random_bytes","return_type":"bytea","arguments":"integer","type":"FUNCTION"},{"name":"extensions.encrypt","return_type":"bytea","arguments":"bytea, bytea, text","type":"FUNCTION"},{"name":"extensions.decrypt","return_type":"bytea","arguments":"bytea, bytea, text","type":"FUNCTION"},{"name":"extensions.encrypt_iv","return_type":"bytea","arguments":"bytea, bytea, bytea, text","type":"FUNCTION"},{"name":"extensions.gen_random_uuid","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"extensions.uuid_nil","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"extensions.uuid_ns_dns","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"storage.search","return_type":"record","arguments":"prefix text, bucketname text, limits integer DEFAULT 100, levels integer DEFAULT 1, offsets integer DEFAULT 0","type":"FUNCTION"},{"name":"extensions.uuid_ns_url","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"extensions.uuid_ns_oid","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"auth.uid","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"auth.email","return_type":"text","arguments":"","type":"FUNCTION"},{"name":"extensions.uuid_generate_v3","return_type":"uuid","arguments":"namespace uuid, name text","type":"FUNCTION"},{"name":"extensions.uuid_ns_x500","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"extensions.uuid_generate_v1","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"extensions.uuid_generate_v1mc","return_type":"uuid","arguments":"","type":"FUNCTION"},{"name":"net.check_worker_is_up","return_type":"void","arguments":"","type":"FUNCTION"},{"name":"net._await_response","return_type":"bool","arguments":"request_id bigint","type":"FUNCTION"},{"name":"net._urlencode_string","return_type":"text","arguments":"string character varying","type":"FUNCTION"},{"name":"net._encode_url_with_params_array","return_type":"text","arguments":"url text, params_array text[]","type":"FUNCTION"},{"name":"extensions.pgp_sym_decrypt","return_type":"text","arguments":"bytea, text","type":"FUNCTION"},{"name":"extensions.pgp_sym_decrypt_bytea","return_type":"bytea","arguments":"bytea, text","type":"FUNCTION"},{"name":"extensions.pgp_sym_decrypt","return_type":"text","arguments":"bytea, text, text","type":"FUNCTION"},{"name":"extensions.pgp_sym_decrypt_bytea","return_type":"bytea","arguments":"bytea, text, text","type":"FUNCTION"},{"name":"extensions.pgp_pub_encrypt","return_type":"bytea","arguments":"text, bytea","type":"FUNCTION"},{"name":"extensions.pgp_pub_encrypt_bytea","return_type":"bytea","arguments":"bytea, bytea","type":"FUNCTION"},{"name":"extensions.pgp_pub_encrypt","return_type":"bytea","arguments":"text, bytea, text","type":"FUNCTION"},{"name":"extensions.pgp_pub_encrypt_bytea","return_type":"bytea","arguments":"bytea, bytea, text","type":"FUNCTION"},{"name":"extensions.pgp_pub_decrypt","return_type":"text","arguments":"bytea, bytea","type":"FUNCTION"},{"name":"extensions.pgp_pub_decrypt_bytea","return_type":"bytea","arguments":"bytea, bytea","type":"FUNCTION"},{"name":"net.http_delete","return_type":"int8","arguments":"url text, params jsonb DEFAULT '{}'::jsonb, headers jsonb DEFAULT '{}'::jsonb, timeout_milliseconds integer DEFAULT 2000","type":"FUNCTION"},{"name":"net._http_collect_response","return_type":"http_response_result","arguments":"request_id bigint, async boolean DEFAULT true","type":"FUNCTION"},{"name":"net.http_collect_response","return_type":"http_response_result","arguments":"request_id bigint, async boolean DEFAULT true","type":"FUNCTION"},{"name":"supabase_functions.http_request","return_type":"trigger","arguments":"","type":"FUNCTION"},{"name":"public.active_subject_count","return_type":"int4","arguments":"study study","type":"FUNCTION"},{"name":"public.can_edit","return_type":"bool","arguments":"user_id uuid, study_param study","type":"FUNCTION"},{"name":"public.get_study_from_invite","return_type":"record","arguments":"invite_code text","type":"FUNCTION"},{"name":"public.get_study_record_from_invite","return_type":"study","arguments":"invite_code text","type":"FUNCTION"},{"name":"public.handle_new_user","return_type":"trigger","arguments":"","type":"FUNCTION"},{"name":"public.has_study_ended","return_type":"bool","arguments":"psubject_id uuid","type":"FUNCTION"},{"name":"public.has_study_ended","return_type":"bool","arguments":"subject study_subject","type":"FUNCTION"},{"name":"public.is_active_subject","return_type":"bool","arguments":"psubject_id uuid, days_active integer","type":"FUNCTION"},{"name":"public.is_study_subject_of","return_type":"bool","arguments":"_user_id uuid, _study_id uuid","type":"FUNCTION"},{"name":"public.last_completed_task","return_type":"date","arguments":"psubject_id uuid","type":"FUNCTION"},{"name":"public.study_active_days","return_type":"_int4","arguments":"study_param study","type":"FUNCTION"},{"name":"public.study_ended_count","return_type":"int4","arguments":"study study","type":"FUNCTION"},{"name":"public.study_length","return_type":"int4","arguments":"study_param study","type":"FUNCTION"},{"name":"public.study_missed_days","return_type":"_int4","arguments":"study_param study","type":"FUNCTION"},{"name":"public.study_participant_count","return_type":"int4","arguments":"study study","type":"FUNCTION"},{"name":"public.study_total_tasks","return_type":"int4","arguments":"subject study_subject","type":"FUNCTION"},{"name":"net.http_get","return_type":"int8","arguments":"url text, params jsonb DEFAULT '{}'::jsonb, headers jsonb DEFAULT '{}'::jsonb, timeout_milliseconds integer DEFAULT 2000","type":"FUNCTION"},{"name":"extensions.pgp_pub_decrypt_bytea","return_type":"bytea","arguments":"bytea, bytea, text, text","type":"FUNCTION"},{"name":"extensions.pgp_key_id","return_type":"text","arguments":"bytea","type":"FUNCTION"},{"name":"extensions.armor","return_type":"text","arguments":"bytea","type":"FUNCTION"},{"name":"extensions.armor","return_type":"text","arguments":"bytea, text[], text[]","type":"FUNCTION"},{"name":"extensions.dearmor","return_type":"bytea","arguments":"text","type":"FUNCTION"},{"name":"extensions.pgp_armor_headers","return_type":"record","arguments":"text, OUT key text, OUT value text","type":"FUNCTION"},{"name":"extensions.url_encode","return_type":"text","arguments":"data bytea","type":"FUNCTION"},{"name":"extensions.url_decode","return_type":"bytea","arguments":"data text","type":"FUNCTION"},{"name":"extensions.algorithm_sign","return_type":"text","arguments":"signables text, secret text, algorithm text","type":"FUNCTION"},{"name":"public.subject_current_day","return_type":"int4","arguments":"subject study_subject","type":"FUNCTION"},{"name":"public.subject_total_active_days","return_type":"int4","arguments":"subject study_subject","type":"FUNCTION"},{"name":"public.user_email","return_type":"text","arguments":"user_id uuid","type":"FUNCTION"},{"name":"extensions.hmac","return_type":"bytea","arguments":"bytea, bytea, text","type":"FUNCTION"},{"name":"auth.role","return_type":"text","arguments":"","type":"FUNCTION"},{"name":"extensions.uuid_generate_v5","return_type":"uuid","arguments":"namespace uuid, name text","type":"FUNCTION"},{"name":"extensions.digest","return_type":"bytea","arguments":"bytea, text","type":"FUNCTION"},{"name":"extensions.hmac","return_type":"bytea","arguments":"text, text, text","type":"FUNCTION"},{"name":"extensions.crypt","return_type":"text","arguments":"text, text","type":"FUNCTION"},{"name":"extensions.gen_salt","return_type":"text","arguments":"text","type":"FUNCTION"},{"name":"extensions.gen_salt","return_type":"text","arguments":"text, integer","type":"FUNCTION"},{"name":"extensions.try_cast_double","return_type":"float8","arguments":"inp text","type":"FUNCTION"},{"name":"extensions.moddatetime","return_type":"trigger","arguments":"","type":"FUNCTION"},{"name":"extensions.pgrst_drop_watch","return_type":"event_trigger","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_pwhash_saltgen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"extensions.pgrst_ddl_watch","return_type":"event_trigger","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_kx_client_session_keys","return_type":"crypto_kx_session","arguments":"client_pk bytea, client_sk bytea, server_pk bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_kx_server_session_keys","return_type":"crypto_kx_session","arguments":"server_pk bytea, server_sk bytea, client_pk bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha512_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_box_new_seed","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_new_seed","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"extensions.set_graphql_placeholder","return_type":"event_trigger","arguments":"","type":"FUNCTION"},{"name":"extensions.grant_pg_graphql_access","return_type":"event_trigger","arguments":"","type":"FUNCTION"},{"name":"graphql_public.graphql","return_type":"jsonb","arguments":"\"operationName\" text DEFAULT NULL::text, query text DEFAULT NULL::text, variables jsonb DEFAULT NULL::jsonb, extensions jsonb DEFAULT NULL::jsonb","type":"FUNCTION"},{"name":"graphql.resolve","return_type":"jsonb","arguments":"query text, variables jsonb DEFAULT '{}'::jsonb, \"operationName\" text DEFAULT NULL::text, extensions jsonb DEFAULT NULL::jsonb","type":"FUNCTION"},{"name":"graphql.increment_schema_version","return_type":"event_trigger","arguments":"","type":"FUNCTION"},{"name":"graphql.get_schema_version","return_type":"int4","arguments":"","type":"FUNCTION"},{"name":"graphql.comment_directive","return_type":"jsonb","arguments":"comment_ text","type":"FUNCTION"},{"name":"graphql.exception","return_type":"text","arguments":"message text","type":"FUNCTION"},{"name":"net.http_post","return_type":"int8","arguments":"url text, body jsonb DEFAULT '{}'::jsonb, params jsonb DEFAULT '{}'::jsonb, headers jsonb DEFAULT '{\"Content-Type\": \"application/json\"}'::jsonb, timeout_milliseconds integer DEFAULT 2000","type":"FUNCTION"},{"name":"pgsodium.derive_key","return_type":"bytea","arguments":"key_id bigint, key_len integer DEFAULT 32, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.pgsodium_derive","return_type":"bytea","arguments":"key_id bigint, key_len integer DEFAULT 32, context bytea DEFAULT decode('pgsodium'::text, 'escape'::text)","type":"FUNCTION"},{"name":"pgsodium.randombytes_new_seed","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_secretbox_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_ietf_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_shorthash_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_generichash_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_kdf_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_kx_new_keypair","return_type":"crypto_kx_keypair","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_kx_new_seed","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_kx_seed_new_keypair","return_type":"crypto_kx_keypair","arguments":"seed bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha256_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_box_new_keypair","return_type":"crypto_box_keypair","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_new_keypair","return_type":"crypto_sign_keypair","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_init","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_update","return_type":"bytea","arguments":"state bytea, message bytea","type":"FUNCTION"},{"name":"pgsodium.randombytes_random","return_type":"int4","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_secretbox_noncegen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_ietf_noncegen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_secretstream_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_stream_xchacha20_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_stream_xchacha20_noncegen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_cmp","return_type":"bool","arguments":"text, text","type":"FUNCTION"},{"name":"pgsodium.crypto_signcrypt_new_keypair","return_type":"crypto_signcrypt_keypair","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_encrypt","return_type":"bytea","arguments":"message bytea, additional bytea, key bytea, nonce bytea DEFAULT NULL::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_decrypt","return_type":"bytea","arguments":"ciphertext bytea, additional bytea, key bytea, nonce bytea DEFAULT NULL::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_encrypt","return_type":"bytea","arguments":"message bytea, additional bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea, nonce bytea DEFAULT NULL::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_decrypt","return_type":"bytea","arguments":"message bytea, additional bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea, nonce bytea DEFAULT NULL::bytea","type":"FUNCTION"},{"name":"pgsodium.version","return_type":"text","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_noncegen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"pgsodium.crypto_pwhash_str","return_type":"bytea","arguments":"password bytea","type":"FUNCTION"},{"name":"pgsodium.has_mask","return_type":"bool","arguments":"role regrole, source_name text","type":"FUNCTION"},{"name":"pgsodium.mask_columns","return_type":"record","arguments":"source_relid oid","type":"FUNCTION"},{"name":"pgsodium.create_mask_view","return_type":"void","arguments":"relid oid, debug boolean DEFAULT false","type":"FUNCTION"},{"name":"pgsodium.create_key","return_type":"valid_key","arguments":"key_type pgsodium.key_type DEFAULT 'aead-det'::pgsodium.key_type, name text DEFAULT NULL::text, raw_key bytea DEFAULT NULL::bytea, raw_key_nonce bytea DEFAULT NULL::bytea, parent_key uuid DEFAULT NULL::uuid, key_context bytea DEFAULT '\\x7067736f6469756d'::bytea, expires timestamp with time zone DEFAULT NULL::timestamp with time zone, associated_data text DEFAULT ''::text","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_ietf_decrypt","return_type":"bytea","arguments":"message bytea, additional bytea, nonce bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_pwhash_str_verify","return_type":"bool","arguments":"hashed_password bytea, password bytea","type":"FUNCTION"},{"name":"pgsodium.quote_assoc","return_type":"text","arguments":"text, boolean DEFAULT false","type":"FUNCTION"},{"name":"pgsodium.crypto_shorthash","return_type":"bytea","arguments":"message bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_kdf_derive_from_key","return_type":"bytea","arguments":"subkey_size integer, subkey_id bigint, context bytea, primary_key uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_pwhash","return_type":"bytea","arguments":"password bytea, salt bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_encrypt","return_type":"bytea","arguments":"message bytea, additional bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_decrypt","return_type":"bytea","arguments":"message bytea, additional bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_ietf_encrypt","return_type":"bytea","arguments":"message bytea, additional bytea, nonce bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.get_key_by_id","return_type":"valid_key","arguments":"uuid","type":"FUNCTION"},{"name":"pgsodium.get_key_by_name","return_type":"valid_key","arguments":"text","type":"FUNCTION"},{"name":"pgsodium.get_named_keys","return_type":"valid_key","arguments":"filter text DEFAULT '%'::text","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_ietf_encrypt","return_type":"bytea","arguments":"message bytea, additional bytea, nonce bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.enable_security_label_trigger","return_type":"void","arguments":"","type":"FUNCTION"},{"name":"pgsodium.disable_security_label_trigger","return_type":"void","arguments":"","type":"FUNCTION"},{"name":"pgsodium.update_mask","return_type":"void","arguments":"target oid, debug boolean DEFAULT false","type":"FUNCTION"},{"name":"pgsodium.mask_role","return_type":"void","arguments":"masked_role regrole, source_name text, view_name text","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_update_agg1","return_type":"bytea","arguments":"state bytea, message bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_update_agg2","return_type":"bytea","arguments":"cur_state bytea, initial_state bytea, message bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_update_agg","return_type":"bytea","arguments":"message bytea","type":"a"},{"name":"pgsodium.crypto_sign_update_agg","return_type":"bytea","arguments":"state bytea, message bytea","type":"a"},{"name":"pgsodium.encrypted_columns","return_type":"text","arguments":"relid oid","type":"FUNCTION"},{"name":"pgsodium.decrypted_columns","return_type":"text","arguments":"relid oid","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_ietf_encrypt","return_type":"bytea","arguments":"message bytea, additional bytea, nonce bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_ietf_decrypt","return_type":"bytea","arguments":"message bytea, additional bytea, nonce bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_ietf_decrypt","return_type":"bytea","arguments":"message bytea, additional bytea, nonce bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_auth","return_type":"bytea","arguments":"message bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth","return_type":"bytea","arguments":"message bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth","return_type":"bytea","arguments":"message bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_verify","return_type":"bool","arguments":"mac bytea, message bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_verify","return_type":"bool","arguments":"mac bytea, message bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_verify","return_type":"bool","arguments":"mac bytea, message bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_box_seed_new_keypair","return_type":"crypto_box_keypair","arguments":"seed bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_box","return_type":"bytea","arguments":"message bytea, nonce bytea, public bytea, secret bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_box_open","return_type":"bytea","arguments":"ciphertext bytea, nonce bytea, public bytea, secret bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_box_seal","return_type":"bytea","arguments":"message bytea, public_key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_box_seal_open","return_type":"bytea","arguments":"ciphertext bytea, public_key bytea, secret_key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_generichash","return_type":"bytea","arguments":"message bytea, key bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_generichash","return_type":"bytea","arguments":"message bytea, key bytea DEFAULT NULL::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_generichash","return_type":"bytea","arguments":"message bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_shorthash","return_type":"bytea","arguments":"message bytea, key bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_shorthash","return_type":"bytea","arguments":"message bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.sodium_bin2base64","return_type":"text","arguments":"bin bytea","type":"FUNCTION"},{"name":"pgsodium.sodium_base642bin","return_type":"bytea","arguments":"base64 text","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha512","return_type":"bytea","arguments":"message bytea, secret bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha512","return_type":"bytea","arguments":"message bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha512","return_type":"bytea","arguments":"message bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha512_verify","return_type":"bool","arguments":"hash bytea, message bytea, secret bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha512_verify","return_type":"bool","arguments":"hash bytea, message bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha512_verify","return_type":"bool","arguments":"signature bytea, message bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha256","return_type":"bytea","arguments":"message bytea, secret bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha256","return_type":"bytea","arguments":"message bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha256","return_type":"bytea","arguments":"message bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha256_verify","return_type":"bool","arguments":"hash bytea, message bytea, secret bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha256_verify","return_type":"bool","arguments":"hash bytea, message bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_auth_hmacsha256_verify","return_type":"bool","arguments":"signature bytea, message bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_kdf_derive_from_key","return_type":"bytea","arguments":"subkey_size bigint, subkey_id bigint, context bytea, primary_key bytea","type":"FUNCTION"},{"name":"pgsodium.randombytes_uniform","return_type":"int4","arguments":"upper_bound integer","type":"FUNCTION"},{"name":"pgsodium.randombytes_buf","return_type":"bytea","arguments":"size integer","type":"FUNCTION"},{"name":"pgsodium.randombytes_buf_deterministic","return_type":"bytea","arguments":"size integer, seed bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_secretbox","return_type":"bytea","arguments":"message bytea, nonce bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_secretbox","return_type":"bytea","arguments":"message bytea, nonce bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_secretbox","return_type":"bytea","arguments":"message bytea, nonce bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_secretbox_open","return_type":"bytea","arguments":"ciphertext bytea, nonce bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_secretbox_open","return_type":"bytea","arguments":"message bytea, nonce bytea, key_id bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_secretbox_open","return_type":"bytea","arguments":"message bytea, nonce bytea, key_uuid uuid","type":"FUNCTION"},{"name":"pgsodium.crypto_hash_sha256","return_type":"bytea","arguments":"message bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_hash_sha512","return_type":"bytea","arguments":"message bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_sign","return_type":"bytea","arguments":"message bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_detached","return_type":"bytea","arguments":"message bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_final_create","return_type":"bytea","arguments":"state bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_final_verify","return_type":"bool","arguments":"state bytea, signature bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_open","return_type":"bytea","arguments":"signed_message bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_seed_new_keypair","return_type":"crypto_sign_keypair","arguments":"seed bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_sign_verify_detached","return_type":"bool","arguments":"sig bytea, message bytea, key bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_signcrypt_sign_after","return_type":"bytea","arguments":"state bytea, sender_sk bytea, ciphertext bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_signcrypt_sign_before","return_type":"crypto_signcrypt_state_key","arguments":"sender bytea, recipient bytea, sender_sk bytea, recipient_pk bytea, additional bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_signcrypt_verify_after","return_type":"bool","arguments":"state bytea, signature bytea, sender_pk bytea, ciphertext bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_signcrypt_verify_before","return_type":"crypto_signcrypt_state_key","arguments":"signature bytea, sender bytea, recipient bytea, additional bytea, sender_pk bytea, recipient_sk bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_signcrypt_verify_public","return_type":"bool","arguments":"signature bytea, sender bytea, recipient bytea, additional bytea, sender_pk bytea, ciphertext bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_stream_xchacha20","return_type":"bytea","arguments":"bigint, bytea, bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_stream_xchacha20","return_type":"bytea","arguments":"bigint, bytea, bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_stream_xchacha20_xor","return_type":"bytea","arguments":"bytea, bytea, bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_stream_xchacha20_xor","return_type":"bytea","arguments":"bytea, bytea, bigint, context bytea DEFAULT '\\x70676f736469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_stream_xchacha20_xor_ic","return_type":"bytea","arguments":"bytea, bytea, bigint, bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_stream_xchacha20_xor_ic","return_type":"bytea","arguments":"bytea, bytea, bigint, bigint, context bytea DEFAULT '\\x7067736f6469756d'::bytea","type":"FUNCTION"},{"name":"pgsodium.encrypted_column","return_type":"text","arguments":"relid oid, m record","type":"FUNCTION"},{"name":"pgsodium.update_masks","return_type":"void","arguments":"debug boolean DEFAULT false","type":"FUNCTION"},{"name":"pgsodium.key_encrypt_secret_raw_key","return_type":"trigger","arguments":"","type":"FUNCTION"},{"name":"pgsodium.trg_mask_update","return_type":"event_trigger","arguments":"","type":"FUNCTION"},{"name":"pgsodium.create_mask_view","return_type":"void","arguments":"relid oid, subid integer, debug boolean DEFAULT false","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_decrypt","return_type":"bytea","arguments":"message bytea, additional bytea, key_uuid uuid, nonce bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_encrypt","return_type":"bytea","arguments":"message bytea, additional bytea, key_uuid uuid, nonce bytea","type":"FUNCTION"},{"name":"pgsodium.crypto_aead_det_keygen","return_type":"bytea","arguments":"","type":"FUNCTION"},{"name":"vault.secrets_encrypt_secret_secret","return_type":"trigger","arguments":"","type":"FUNCTION"},{"name":"vault.create_secret","return_type":"uuid","arguments":"new_secret text, new_name text DEFAULT NULL::text, new_description text DEFAULT ''::text, new_key_id uuid DEFAULT NULL::uuid","type":"FUNCTION"},{"name":"vault.update_secret","return_type":"void","arguments":"secret_id uuid, new_secret text DEFAULT NULL::text, new_name text DEFAULT NULL::text, new_description text DEFAULT NULL::text, new_key_id uuid DEFAULT NULL::uuid","type":"FUNCTION"},{"name":"extensions.pgp_pub_decrypt","return_type":"text","arguments":"bytea, bytea, text","type":"FUNCTION"},{"name":"extensions.pgp_pub_decrypt_bytea","return_type":"bytea","arguments":"bytea, bytea, text","type":"FUNCTION"},{"name":"extensions.pgp_pub_decrypt","return_type":"text","arguments":"bytea, bytea, text, text","type":"FUNCTION"},{"name":"extensions.sign","return_type":"text","arguments":"payload json, secret text, algorithm text DEFAULT 'HS256'::text","type":"FUNCTION"},{"name":"extensions.pgp_sym_encrypt","return_type":"bytea","arguments":"text, text","type":"FUNCTION"},{"name":"extensions.pgp_sym_encrypt_bytea","return_type":"bytea","arguments":"bytea, text","type":"FUNCTION"},{"name":"extensions.pgp_sym_encrypt","return_type":"bytea","arguments":"text, text, text","type":"FUNCTION"},{"name":"extensions.pgp_sym_encrypt_bytea","return_type":"bytea","arguments":"bytea, text, text","type":"FUNCTION"},{"name":"extensions.pg_stat_statements_info","return_type":"record","arguments":"OUT dealloc bigint, OUT stats_reset timestamp with time zone","type":"FUNCTION"},{"name":"extensions.pg_stat_statements","return_type":"record","arguments":"showtext boolean, OUT userid oid, OUT dbid oid, OUT toplevel boolean, OUT queryid bigint, OUT query text, OUT plans bigint, OUT total_plan_time double precision, OUT min_plan_time double precision, OUT max_plan_time double precision, OUT mean_plan_time double precision, OUT stddev_plan_time double precision, OUT calls bigint, OUT total_exec_time double precision, OUT min_exec_time double precision, OUT max_exec_time double precision, OUT mean_exec_time double precision, OUT stddev_exec_time double precision, OUT rows bigint, OUT shared_blks_hit bigint, OUT shared_blks_read bigint, OUT shared_blks_dirtied bigint, OUT shared_blks_written bigint, OUT local_blks_hit bigint, OUT local_blks_read bigint, OUT local_blks_dirtied bigint, OUT local_blks_written bigint, OUT temp_blks_read bigint, OUT temp_blks_written bigint, OUT blk_read_time double precision, OUT blk_write_time double precision, OUT temp_blk_read_time double precision, OUT temp_blk_write_time double precision, OUT wal_records bigint, OUT wal_fpi bigint, OUT wal_bytes numeric, OUT jit_functions bigint, OUT jit_generation_time double precision, OUT jit_inlining_count bigint, OUT jit_inlining_time double precision, OUT jit_optimization_count bigint, OUT jit_optimization_time double precision, OUT jit_emission_count bigint, OUT jit_emission_time double precision","type":"FUNCTION"},{"name":"extensions.verify","return_type":"record","arguments":"token text, secret text, algorithm text DEFAULT 'HS256'::text","type":"FUNCTION"},{"name":"extensions.grant_pg_cron_access","return_type":"event_trigger","arguments":"","type":"FUNCTION"},{"name":"extensions.grant_pg_net_access","return_type":"event_trigger","arguments":"","type":"FUNCTION"},{"name":"extensions.pg_stat_statements_reset","return_type":"void","arguments":"userid oid DEFAULT 0, dbid oid DEFAULT 0, queryid bigint DEFAULT 0","type":"FUNCTION"}],"driver":{"name":"postgres","database_version":"PostgreSQL 15.1 (Ubuntu 15.1-1.pgdg20.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0, 64-bit","meta":{"current_schema":"public","search_paths":["\"\\$user\"","public","extensions"],"dict":{"Functions":"Stored procedures and functions"}}}} diff --git a/docs/database/schema.svg b/docs/database/schema.svg index 39752f29b..61b933e33 100644 --- a/docs/database/schema.svg +++ b/docs/database/schema.svg @@ -4,1130 +4,1133 @@ - - + + postgres - + auth.users - - -auth.users -     -[BASE TABLE] + + +auth.users +     +[BASE TABLE] + +instance_id     +[uuid] -instance_id     -[uuid] +id     +[uuid] -id     -[uuid] +aud     +[varchar(255)] -aud     -[varchar(255)] +role     +[varchar(255)] -role     -[varchar(255)] +email     +[varchar(255)] -email     -[varchar(255)] +encrypted_password     +[varchar(255)] -encrypted_password     -[varchar(255)] +confirmed_at     +[timestamp with time zone] -confirmed_at     -[timestamp with time zone] +invited_at     +[timestamp with time zone] -invited_at     -[timestamp with time zone] +confirmation_token     +[varchar(255)] -confirmation_token     -[varchar(255)] +confirmation_sent_at     +[timestamp with time zone] -confirmation_sent_at     -[timestamp with time zone] +recovery_token     +[varchar(255)] -recovery_token     -[varchar(255)] +recovery_sent_at     +[timestamp with time zone] -recovery_sent_at     -[timestamp with time zone] +email_change_token     +[varchar(255)] -email_change_token     -[varchar(255)] +email_change     +[varchar(255)] -email_change     -[varchar(255)] +email_change_sent_at     +[timestamp with time zone] -email_change_sent_at     -[timestamp with time zone] +last_sign_in_at     +[timestamp with time zone] -last_sign_in_at     -[timestamp with time zone] +raw_app_meta_data     +[jsonb] -raw_app_meta_data     -[jsonb] +raw_user_meta_data     +[jsonb] -raw_user_meta_data     -[jsonb] +is_super_admin     +[boolean] -is_super_admin     -[boolean] +created_at     +[timestamp with time zone] -created_at     -[timestamp with time zone] - -updated_at     -[timestamp with time zone] +updated_at     +[timestamp with time zone] auth.refresh_tokens - - -auth.refresh_tokens -     -[BASE TABLE] + + +auth.refresh_tokens +     +[BASE TABLE] + +instance_id     +[uuid] -instance_id     -[uuid] +id     +[bigint] -id     -[bigint] +token     +[varchar(255)] -token     -[varchar(255)] +user_id     +[varchar(255)] -user_id     -[varchar(255)] +revoked     +[boolean] -revoked     -[boolean] +created_at     +[timestamp with time zone] -created_at     -[timestamp with time zone] - -updated_at     -[timestamp with time zone] +updated_at     +[timestamp with time zone] auth.instances - - -auth.instances -     -[BASE TABLE] + + +auth.instances +     +[BASE TABLE] + +id     +[uuid] -id     -[uuid] +uuid     +[uuid] -uuid     -[uuid] +raw_base_config     +[text] -raw_base_config     -[text] +created_at     +[timestamp with time zone] -created_at     -[timestamp with time zone] - -updated_at     -[timestamp with time zone] +updated_at     +[timestamp with time zone] auth.audit_log_entries - - -auth.audit_log_entries -     -[BASE TABLE] + + +auth.audit_log_entries +     +[BASE TABLE] + +instance_id     +[uuid] -instance_id     -[uuid] +id     +[uuid] -id     -[uuid] +payload     +[json] -payload     -[json] - -created_at     -[timestamp with time zone] +created_at     +[timestamp with time zone] auth.schema_migrations - - -auth.schema_migrations -     -[BASE TABLE] - -version     -[varchar(255)] + + +auth.schema_migrations +     +[BASE TABLE] + +version     +[varchar(255)] storage.buckets - - -storage.buckets -     -[BASE TABLE] + + +storage.buckets +     +[BASE TABLE] + +id     +[text] -id     -[text] +name     +[text] -name     -[text] +owner     +[uuid] -owner     -[uuid] +created_at     +[timestamp with time zone] -created_at     -[timestamp with time zone] - -updated_at     -[timestamp with time zone] +updated_at     +[timestamp with time zone] storage.buckets:owner->auth.users:id - - -FOREIGN KEY (owner) REFERENCES auth.users(id) + + +FOREIGN KEY (owner) REFERENCES auth.users(id) storage.objects - - -storage.objects -     -[BASE TABLE] + + +storage.objects +     +[BASE TABLE] + +id     +[uuid] -id     -[uuid] +bucket_id     +[text] -bucket_id     -[text] +name     +[text] -name     -[text] +owner     +[uuid] -owner     -[uuid] +created_at     +[timestamp with time zone] -created_at     -[timestamp with time zone] +updated_at     +[timestamp with time zone] -updated_at     -[timestamp with time zone] +last_accessed_at     +[timestamp with time zone] -last_accessed_at     -[timestamp with time zone] - -metadata     -[jsonb] +metadata     +[jsonb] storage.objects:owner->auth.users:id - - -FOREIGN KEY (owner) REFERENCES auth.users(id) + + +FOREIGN KEY (owner) REFERENCES auth.users(id) storage.objects:bucket_id->storage.buckets:id - - -FOREIGN KEY (bucket_id) REFERENCES storage.buckets(id) + + +FOREIGN KEY (bucket_id) REFERENCES storage.buckets(id) storage.migrations - - -storage.migrations -     -[BASE TABLE] + + +storage.migrations +     +[BASE TABLE] + +id     +[integer] -id     -[integer] +name     +[varchar(100)] -name     -[varchar(100)] +hash     +[varchar(40)] -hash     -[varchar(40)] - -executed_at     -[timestamp without time zone] +executed_at     +[timestamp without time zone] net.http_request_queue - - -net.http_request_queue -     -[BASE TABLE] + + +net.http_request_queue +     +[BASE TABLE] + +id     +[bigint] -id     -[bigint] +method     +[net.http_method] -method     -[net.http_method] +url     +[text] -url     -[text] +headers     +[jsonb] -headers     -[jsonb] +body     +[bytea] -body     -[bytea] - -timeout_milliseconds     -[integer] +timeout_milliseconds     +[integer] net._http_response - - -net._http_response -     -[BASE TABLE] + + +net._http_response +     +[BASE TABLE] + +id     +[bigint] -id     -[bigint] +status_code     +[integer] -status_code     -[integer] +content_type     +[text] -content_type     -[text] +headers     +[jsonb] -headers     -[jsonb] +content     +[text] -content     -[text] +timed_out     +[boolean] -timed_out     -[boolean] +error_msg     +[text] -error_msg     -[text] - -created     -[timestamp with time zone] +created     +[timestamp with time zone] supabase_functions.migrations - - -supabase_functions.migrations -     -[BASE TABLE] + + +supabase_functions.migrations +     +[BASE TABLE] + +version     +[text] -version     -[text] - -inserted_at     -[timestamp with time zone] +inserted_at     +[timestamp with time zone] supabase_functions.hooks - - -supabase_functions.hooks -     -[BASE TABLE] + + +supabase_functions.hooks +     +[BASE TABLE] + +id     +[bigint] -id     -[bigint] +hook_table_id     +[integer] -hook_table_id     -[integer] +hook_name     +[text] -hook_name     -[text] +created_at     +[timestamp with time zone] -created_at     -[timestamp with time zone] - -request_id     -[bigint] +request_id     +[bigint] public.study - - -public.study -     -[BASE TABLE] + + +public.study +     +[BASE TABLE] + +id     +[uuid] -id     -[uuid] +contact     +[jsonb] -contact     -[jsonb] +title     +[text] -title     -[text] +description     +[text] -description     -[text] +icon_name     +[text] -icon_name     -[text] +published     +[boolean] -published     -[boolean] +registry_published     +[boolean] -registry_published     -[boolean] +questionnaire     +[jsonb] -questionnaire     -[jsonb] +eligibility_criteria     +[jsonb] -eligibility_criteria     -[jsonb] +observations     +[jsonb] -observations     -[jsonb] +interventions     +[jsonb] -interventions     -[jsonb] +consent     +[jsonb] -consent     -[jsonb] +schedule     +[jsonb] -schedule     -[jsonb] +report_specification     +[jsonb] -report_specification     -[jsonb] +results     +[jsonb] -results     -[jsonb] +created_at     +[timestamp with time zone] -created_at     -[timestamp with time zone] +updated_at     +[timestamp with time zone] -updated_at     -[timestamp with time zone] +user_id     +[uuid] -user_id     -[uuid] +participation     +[participation] -participation     -[participation] +result_sharing     +[result_sharing] -result_sharing     -[result_sharing] - -collaborator_emails     -[text[]] +collaborator_emails     +[text[]] public.user - - -public.user -     -[BASE TABLE] + + +public.user +     +[BASE TABLE] + +id     +[uuid] -id     -[uuid] +email     +[text] -email     -[text] +preferences     +[jsonb] public.study:user_id->public.user:id - - -FOREIGN KEY (user_id) REFERENCES "user"(id) + + +FOREIGN KEY (user_id) REFERENCES "user"(id) public.study_subject - - -public.study_subject -     -[BASE TABLE] + + +public.study_subject +     +[BASE TABLE] + +id     +[uuid] -id     -[uuid] +study_id     +[uuid] -study_id     -[uuid] +user_id     +[uuid] -user_id     -[uuid] +started_at     +[timestamp with time zone] -started_at     -[timestamp with time zone] +selected_intervention_ids     +[text[]] -selected_intervention_ids     -[text[]] +invite_code     +[text] -invite_code     -[text] - -is_deleted     -[boolean] +is_deleted     +[boolean] - + public.study_subject:study_id->public.study:id - - -FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE + + +FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE public.study_invite - - -public.study_invite -     -[BASE TABLE] + + +public.study_invite +     +[BASE TABLE] + +code     +[text] -code     -[text] +study_id     +[uuid] -study_id     -[uuid] - -preselected_intervention_ids     -[text[]] +preselected_intervention_ids     +[text[]] - + public.study_subject:invite_code->public.study_invite:code - - -FOREIGN KEY (invite_code) REFERENCES study_invite(code) ON DELETE CASCADE + + +FOREIGN KEY (invite_code) REFERENCES study_invite(code) ON DELETE CASCADE public.study_subject:user_id->public.user:id - - -FOREIGN KEY (user_id) REFERENCES "user"(id) + + +FOREIGN KEY (user_id) REFERENCES "user"(id) public.app_config - - -public.app_config -     -[BASE TABLE] + + +public.app_config +     +[BASE TABLE] + +id     +[text] -id     -[text] +app_privacy     +[jsonb] -app_privacy     -[jsonb] +app_terms     +[jsonb] -app_terms     -[jsonb] +designer_privacy     +[jsonb] -designer_privacy     -[jsonb] +designer_terms     +[jsonb] -designer_terms     -[jsonb] +imprint     +[jsonb] -imprint     -[jsonb] +contact     +[jsonb] -contact     -[jsonb] - -analytics     -[jsonb] +analytics     +[jsonb] public.repo - - -public.repo -     -[BASE TABLE] + + +public.repo +     +[BASE TABLE] + +project_id     +[text] -project_id     -[text] +user_id     +[uuid] -user_id     -[uuid] +study_id     +[uuid] -study_id     -[uuid] - -provider     -[git_provider] +provider     +[git_provider] public.repo:study_id->public.study:id - - -FOREIGN KEY (study_id) REFERENCES study(id) + + +FOREIGN KEY (study_id) REFERENCES study(id) public.repo:user_id->public.user:id - - -FOREIGN KEY (user_id) REFERENCES "user"(id) ON DELETE CASCADE + + +FOREIGN KEY (user_id) REFERENCES "user"(id) ON DELETE CASCADE public.study_invite:study_id->public.study:id - - -FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE + + +FOREIGN KEY (study_id) REFERENCES study(id) ON DELETE CASCADE public.subject_progress - - -public.subject_progress -     -[BASE TABLE] + + +public.subject_progress +     +[BASE TABLE] + +completed_at     +[timestamp with time zone] -completed_at     -[timestamp with time zone] +subject_id     +[uuid] -subject_id     -[uuid] +intervention_id     +[text] -intervention_id     -[text] +task_id     +[text] -task_id     -[text] +result_type     +[text] -result_type     -[text] - -result     -[jsonb] +result     +[jsonb] public.subject_progress:subject_id->public.study_subject:id - - -FOREIGN KEY (subject_id) REFERENCES study_subject(id) ON DELETE CASCADE + + +FOREIGN KEY (subject_id) REFERENCES study_subject(id) ON DELETE CASCADE public.study_progress_export - - -public.study_progress_export -     -[VIEW] + + +public.study_progress_export +     +[VIEW] + +completed_at     +[timestamp with time zone] -completed_at     -[timestamp with time zone] +intervention_id     +[text] -intervention_id     -[text] +task_id     +[text] -task_id     -[text] +result_type     +[text] -result_type     -[text] +result     +[jsonb] -result     -[jsonb] +subject_id     +[uuid] -subject_id     -[uuid] +user_id     +[uuid] -user_id     -[uuid] +study_id     +[uuid] -study_id     -[uuid] +started_at     +[timestamp with time zone] -started_at     -[timestamp with time zone] - -selected_intervention_ids     -[text[]] +selected_intervention_ids     +[text[]] extensions.pg_stat_statements_info - - -extensions.pg_stat_statements_info -     -[VIEW] + + +extensions.pg_stat_statements_info +     +[VIEW] + +dealloc     +[bigint] -dealloc     -[bigint] - -stats_reset     -[timestamp with time zone] +stats_reset     +[timestamp with time zone] extensions.pg_stat_statements - - -extensions.pg_stat_statements -     -[VIEW] + + +extensions.pg_stat_statements +     +[VIEW] + +userid     +[oid] -userid     -[oid] +dbid     +[oid] -dbid     -[oid] +toplevel     +[boolean] -toplevel     -[boolean] +queryid     +[bigint] -queryid     -[bigint] +query     +[text] -query     -[text] +plans     +[bigint] -plans     -[bigint] +total_plan_time     +[double precision] -total_plan_time     -[double precision] +min_plan_time     +[double precision] -min_plan_time     -[double precision] +max_plan_time     +[double precision] -max_plan_time     -[double precision] +mean_plan_time     +[double precision] -mean_plan_time     -[double precision] +stddev_plan_time     +[double precision] -stddev_plan_time     -[double precision] +calls     +[bigint] -calls     -[bigint] +total_exec_time     +[double precision] -total_exec_time     -[double precision] +min_exec_time     +[double precision] -min_exec_time     -[double precision] +max_exec_time     +[double precision] -max_exec_time     -[double precision] +mean_exec_time     +[double precision] -mean_exec_time     -[double precision] +stddev_exec_time     +[double precision] -stddev_exec_time     -[double precision] +rows     +[bigint] -rows     -[bigint] +shared_blks_hit     +[bigint] -shared_blks_hit     -[bigint] +shared_blks_read     +[bigint] -shared_blks_read     -[bigint] +shared_blks_dirtied     +[bigint] -shared_blks_dirtied     -[bigint] +shared_blks_written     +[bigint] -shared_blks_written     -[bigint] +local_blks_hit     +[bigint] -local_blks_hit     -[bigint] +local_blks_read     +[bigint] -local_blks_read     -[bigint] +local_blks_dirtied     +[bigint] -local_blks_dirtied     -[bigint] +local_blks_written     +[bigint] -local_blks_written     -[bigint] +temp_blks_read     +[bigint] -temp_blks_read     -[bigint] +temp_blks_written     +[bigint] -temp_blks_written     -[bigint] +blk_read_time     +[double precision] -blk_read_time     -[double precision] +blk_write_time     +[double precision] -blk_write_time     -[double precision] +temp_blk_read_time     +[double precision] -temp_blk_read_time     -[double precision] +temp_blk_write_time     +[double precision] -temp_blk_write_time     -[double precision] +wal_records     +[bigint] -wal_records     -[bigint] +wal_fpi     +[bigint] -wal_fpi     -[bigint] +wal_bytes     +[numeric] -wal_bytes     -[numeric] +jit_functions     +[bigint] -jit_functions     -[bigint] +jit_generation_time     +[double precision] -jit_generation_time     -[double precision] +jit_inlining_count     +[bigint] -jit_inlining_count     -[bigint] +jit_inlining_time     +[double precision] -jit_inlining_time     -[double precision] +jit_optimization_count     +[bigint] -jit_optimization_count     -[bigint] +jit_optimization_time     +[double precision] -jit_optimization_time     -[double precision] +jit_emission_count     +[bigint] -jit_emission_count     -[bigint] - -jit_emission_time     -[double precision] +jit_emission_time     +[double precision] pgsodium.key - - -pgsodium.key -     -[BASE TABLE] + + +pgsodium.key +     +[BASE TABLE] + +id     +[uuid] -id     -[uuid] +status     +[pgsodium.key_status] -status     -[pgsodium.key_status] +created     +[timestamp with time zone] -created     -[timestamp with time zone] +expires     +[timestamp with time zone] -expires     -[timestamp with time zone] +key_type     +[pgsodium.key_type] -key_type     -[pgsodium.key_type] +key_id     +[bigint] -key_id     -[bigint] +key_context     +[bytea] -key_context     -[bytea] +name     +[text] -name     -[text] +associated_data     +[text] -associated_data     -[text] +raw_key     +[bytea] -raw_key     -[bytea] +raw_key_nonce     +[bytea] -raw_key_nonce     -[bytea] +parent_key     +[uuid] -parent_key     -[uuid] +comment     +[text] -comment     -[text] - -user_data     -[text] +user_data     +[text] pgsodium.key:parent_key->pgsodium.key:id - - -FOREIGN KEY (parent_key) REFERENCES pgsodium.key(id) + + +FOREIGN KEY (parent_key) REFERENCES pgsodium.key(id) pgsodium.valid_key - - -pgsodium.valid_key -     -[VIEW] + + +pgsodium.valid_key +     +[VIEW] + +id     +[uuid] -id     -[uuid] +name     +[text] -name     -[text] +status     +[pgsodium.key_status] -status     -[pgsodium.key_status] +key_type     +[pgsodium.key_type] -key_type     -[pgsodium.key_type] +key_id     +[bigint] -key_id     -[bigint] +key_context     +[bytea] -key_context     -[bytea] +created     +[timestamp with time zone] -created     -[timestamp with time zone] +expires     +[timestamp with time zone] -expires     -[timestamp with time zone] - -associated_data     -[text] +associated_data     +[text] pgsodium.masking_rule - - -pgsodium.masking_rule -     -[VIEW] + + +pgsodium.masking_rule +     +[VIEW] + +attrelid     +[oid] -attrelid     -[oid] +attnum     +[integer] -attnum     -[integer] +relnamespace     +[regnamespace] -relnamespace     -[regnamespace] +relname     +[name] -relname     -[name] +attname     +[name] -attname     -[name] +format_type     +[text] -format_type     -[text] +col_description     +[text] -col_description     -[text] +key_id_column     +[text] -key_id_column     -[text] +key_id     +[text] -key_id     -[text] +associated_columns     +[text] -associated_columns     -[text] +nonce_column     +[text] -nonce_column     -[text] +view_name     +[text] -view_name     -[text] - -priority     -[integer] +priority     +[integer] pgsodium.mask_columns - - -pgsodium.mask_columns -     -[VIEW] + + +pgsodium.mask_columns +     +[VIEW] + +attname     +[name] -attname     -[name] +attrelid     +[oid] -attrelid     -[oid] +key_id     +[text] -key_id     -[text] +key_id_column     +[text] -key_id_column     -[text] +associated_columns     +[text] -associated_columns     -[text] +nonce_column     +[text] -nonce_column     -[text] - -format_type     -[text] +format_type     +[text] pgsodium.decrypted_key - - -pgsodium.decrypted_key -     -[VIEW] + + +pgsodium.decrypted_key +     +[VIEW] + +id     +[uuid] -id     -[uuid] +status     +[pgsodium.key_status] -status     -[pgsodium.key_status] +created     +[timestamp with time zone] -created     -[timestamp with time zone] +expires     +[timestamp with time zone] -expires     -[timestamp with time zone] +key_type     +[pgsodium.key_type] -key_type     -[pgsodium.key_type] +key_id     +[bigint] -key_id     -[bigint] +key_context     +[bytea] -key_context     -[bytea] +name     +[text] -name     -[text] +associated_data     +[text] -associated_data     -[text] +raw_key     +[bytea] -raw_key     -[bytea] +decrypted_raw_key     +[bytea] -decrypted_raw_key     -[bytea] +raw_key_nonce     +[bytea] -raw_key_nonce     -[bytea] +parent_key     +[uuid] -parent_key     -[uuid] - -comment     -[text] +comment     +[text] vault.secrets - - -vault.secrets -     -[BASE TABLE] + + +vault.secrets +     +[BASE TABLE] + +id     +[uuid] -id     -[uuid] +name     +[text] -name     -[text] +description     +[text] -description     -[text] +secret     +[text] -secret     -[text] +key_id     +[uuid] -key_id     -[uuid] +nonce     +[bytea] -nonce     -[bytea] +created_at     +[timestamp with time zone] -created_at     -[timestamp with time zone] - -updated_at     -[timestamp with time zone] +updated_at     +[timestamp with time zone] vault.secrets:key_id->pgsodium.key:id - - -FOREIGN KEY (key_id) REFERENCES pgsodium.key(id) + + +FOREIGN KEY (key_id) REFERENCES pgsodium.key(id) vault.decrypted_secrets - - -vault.decrypted_secrets -     -[VIEW] + + +vault.decrypted_secrets +     +[VIEW] + +id     +[uuid] -id     -[uuid] +name     +[text] -name     -[text] +description     +[text] -description     -[text] +secret     +[text] -secret     -[text] +decrypted_secret     +[text] -decrypted_secret     -[text] +key_id     +[uuid] -key_id     -[uuid] +nonce     +[bytea] -nonce     -[bytea] +created_at     +[timestamp with time zone] -created_at     -[timestamp with time zone] - -updated_at     -[timestamp with time zone] +updated_at     +[timestamp with time zone] diff --git a/docs/uml/app/lib/screens/study/report/uml.svg b/docs/uml/app/lib/screens/study/report/uml.svg index af2c76816..2ee1e5358 100644 --- a/docs/uml/app/lib/screens/study/report/uml.svg +++ b/docs/uml/app/lib/screens/study/report/uml.svg @@ -1,22 +1,5 @@ - - [DisclaimerSection - | - +Widget buildContent() - ] - - [<abstract>GenericSection]<:-[DisclaimerSection] - - [ReportDetailsScreen - | - +subject: StudySubject - | - <static>+MaterialPageRoute<dynamic> routeFor(); - +Widget build() - ] - - [ReportDetailsScreen]o-[StudySubject] - - [LinearRegressionSectionWidget + + [LinearRegressionSectionWidget | +section: LinearRegressionSection | @@ -53,19 +36,15 @@ +intervention: String ] - [ReportHistoryScreen - | - +Widget build() - ] - - [ReportHistoryItem + [ReportDetailsScreen | +subject: StudySubject | + <static>+MaterialPageRoute<dynamic> routeFor(); +Widget build() ] - [ReportHistoryItem]o-[StudySubject] + [ReportDetailsScreen]o-[StudySubject] [<abstract>GenericSection | @@ -86,30 +65,26 @@ [<abstract>GenericSection]<:-[GeneralDetailsSection] - [<abstract>ReportSectionWidget + [PerformanceSection | - +subject: StudySubject + +minimumRatio: double; + +maximum: double + | + +Widget buildContent(); + +String getPowerLevelDescription(); + +int getCountableObservationAmount() ] - [<abstract>ReportSectionWidget]o-[StudySubject] + [<abstract>GenericSection]<:-[PerformanceSection] - [ReportSectionContainer + [PerformanceBar | - <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)>; - +section: ReportSection; - +subject: StudySubject; - +primary: bool; - +onTap: void Function()? + +progress: double; + +minimum: double? | - +ReportSectionWidget buildContents(); - +List<Widget> buildPrimaryHeader(); +Widget build() ] - [ReportSectionContainer]o-[<abstract>ReportSection] - [ReportSectionContainer]o-[StudySubject] - [ReportSectionContainer]o-[void Function()?] - [PerformanceDetailsScreen | +reportSubject: StudySubject? @@ -153,209 +128,152 @@ [PerformanceBar]o-[<abstract>Task] - [PerformanceSection + [ReportHistoryScreen | - +minimumRatio: double; - +maximum: double + +Widget build() + ] + + [ReportHistoryItem | - +Widget buildContent(); - +String getPowerLevelDescription(); - +int getCountableObservationAmount() + +subject: StudySubject + | + +Widget build() ] - [<abstract>GenericSection]<:-[PerformanceSection] + [ReportHistoryItem]o-[StudySubject] - [PerformanceBar + [<abstract>ReportSectionWidget | - +progress: double; - +minimum: double? + +subject: StudySubject + ] + + [<abstract>ReportSectionWidget]o-[StudySubject] + + [ReportSectionContainer + | + <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)>; + +section: ReportSection; + +subject: StudySubject; + +primary: bool; + +onTap: void Function()? | + +ReportSectionWidget buildContents(); + +List<Widget> buildPrimaryHeader(); +Widget build() ] + [ReportSectionContainer]o-[<abstract>ReportSection] + [ReportSectionContainer]o-[StudySubject] + [ReportSectionContainer]o-[void Function()?] + + [DisclaimerSection + | + +Widget buildContent() + ] + + [<abstract>GenericSection]<:-[DisclaimerSection] + - + - - - + - + - + + + - + - - - + + + - + - - - + - + - + - + - + + + + + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - DisclaimerSection - - - - - - +Widget buildContent() - - - - - - - - - - - - - GenericSection - - - - - - +subject: StudySubject? - +onTap: void Function()? - - - - - - +Widget buildContent() - +Widget build() - - - - - - - - - - - - - ReportDetailsScreen - - - - - - +subject: StudySubject - - - - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() - - - - - - - - - - - StudySubject - - - + + + - - - + + + - + LinearRegressionSectionWidget - + +section: LinearRegressionSection - + +Widget build() @@ -364,9 +282,9 @@ - + - + LinearRegressionSection @@ -375,16 +293,16 @@ - - + + - + ReportSectionWidget - + +subject: StudySubject @@ -393,17 +311,17 @@ - - - + + + - + AverageSectionWidget - + +section: AverageSection +titlePos: List<int> @@ -411,7 +329,7 @@ - + +Widget build() +Widget getDiagram() @@ -427,9 +345,9 @@ - + - + AverageSection @@ -438,16 +356,16 @@ - - + + - + DiagramDatum - + +x: num +value: num @@ -457,54 +375,75 @@ - - - - + + + + + - - - ReportHistoryScreen + + + ReportDetailsScreen - - - +Widget build() + + + +subject: StudySubject + + + + + + <static>+MaterialPageRoute<dynamic> routeFor() + +Widget build() - - - - - + + + - - - ReportHistoryItem + + + StudySubject - - - +subject: StudySubject + + + + + + + + + + GenericSection - - - +Widget build() + + + +subject: StudySubject? + +onTap: void Function()? + + + + + + +Widget buildContent() + +Widget build() - + - + void Function()? @@ -513,83 +452,95 @@ - - + + - + GeneralDetailsSection - + +Widget buildContent() - - - - - + + + + + - - - ReportSectionContainer + + + PerformanceSection - - - <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)> - +section: ReportSection - +subject: StudySubject - +primary: bool - +onTap: void Function()? + + + +minimumRatio: double + +maximum: double - - - +ReportSectionWidget buildContents() - +List<Widget> buildPrimaryHeader() - +Widget build() + + + +Widget buildContent() + +String getPowerLevelDescription() + +int getCountableObservationAmount() - - - + + + + + - - - ReportSection + + + PerformanceBar + + + + + + +progress: double + +minimum: double? + + + + + + +Widget build() - - - + + + - + PerformanceDetailsScreen - + +reportSubject: StudySubject? - + <static>+MaterialPageRoute<dynamic> routeFor() +Widget build() @@ -599,24 +550,24 @@ - - - + + + - + InterventionPerformanceBar - + +intervention: Intervention +subject: StudySubject? - + +Widget build() @@ -625,9 +576,9 @@ - + - + Intervention @@ -636,24 +587,24 @@ - - - + + + - + ObservationPerformanceBar - + +observation: Observation +subject: StudySubject? - + +Widget build() @@ -662,77 +613,125 @@ - + - + Observation - - - - - + + + - - - PerformanceBar + + + Task - - - +task: Task - +completed: int - +total: int + + + + + + + + + ReportHistoryScreen - - - +Widget build() + + + +Widget build() - - - + + + + + - - - Task + + + ReportHistoryItem + + + + + + +subject: StudySubject + + + + + + +Widget build() - - - - - + + + + + - - - PerformanceSection + + + ReportSectionContainer - - - +minimumRatio: double - +maximum: double + + + <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)> + +section: ReportSection + +subject: StudySubject + +primary: bool + +onTap: void Function()? - - - +Widget buildContent() - +String getPowerLevelDescription() - +int getCountableObservationAmount() + + + +ReportSectionWidget buildContents() + +List<Widget> buildPrimaryHeader() + +Widget build() + + + + + + + + + + + ReportSection + + + + + + + + + + + + DisclaimerSection + + + + + + +Widget buildContent() diff --git a/docs/uml/app/lib/screens/study/uml.svg b/docs/uml/app/lib/screens/study/uml.svg index 06e804733..95019b4c5 100644 --- a/docs/uml/app/lib/screens/study/uml.svg +++ b/docs/uml/app/lib/screens/study/uml.svg @@ -1,20 +1,156 @@ - - [DisclaimerSection + + [DashboardScreen | - +Widget buildContent() + +error: String? ] - [<abstract>GenericSection]<:-[DisclaimerSection] + [OverflowMenuItem + | + +name: String; + +icon: IconData; + +routeName: String?; + +onTap: dynamic Function()? + ] - [ReportDetailsScreen + [OverflowMenuItem]o-[IconData] + [OverflowMenuItem]o-[dynamic Function()?] + + [StudyFinishedPlaceholder | - +subject: StudySubject + <static>+space: SizedBox | - <static>+MaterialPageRoute<dynamic> routeFor(); +Widget build() ] - [ReportDetailsScreen]o-[StudySubject] + [StudyFinishedPlaceholder]o-[SizedBox] + + [TaskBox + | + +taskInstance: TaskInstance; + +icon: Icon; + +onCompleted: dynamic Function() + ] + + [TaskBox]o-[TaskInstance] + [TaskBox]o-[Icon] + [TaskBox]o-[dynamic Function()] + + [ProgressRow + | + +subject: StudySubject? + ] + + [ProgressRow]o-[StudySubject] + + [InterventionSegment + | + +intervention: Intervention; + +percentCompleted: double; + +percentMissed: double; + +isCurrent: bool; + +isFuture: bool; + +phaseDuration: int + | + +List<Widget> buildSeparators(); + +Widget build() + ] + + [InterventionSegment]o-[Intervention] + + [TaskOverview + | + +subject: StudySubject?; + +scheduleToday: List<TaskInstance>?; + +interventionIcon: String? + ] + + [TaskOverview]o-[StudySubject] + + [Settings + ] + + [OptOutAlertDialog + | + +subject: StudySubject? + | + +Widget build() + ] + + [OptOutAlertDialog]o-[StudySubject] + + [DeleteAlertDialog + | + +subject: StudySubject? + | + +Widget build() + ] + + [DeleteAlertDialog]o-[StudySubject] + + [FAQ + | + +Widget build() + ] + + [Entry + | + +title: String; + +children: List<Entry> + ] + + [EntryItem + | + +entry: Entry + | + -Widget _buildTiles(); + +Widget build() + ] + + [EntryItem]o-[Entry] + + [ContactScreen + ] + + [ContactWidget + | + +contact: Contact?; + +title: String; + +subtitle: String?; + +color: Color + | + +Widget build() + ] + + [ContactWidget]o-[Contact] + [ContactWidget]o-[Color] + + [ContactItem + | + +iconData: IconData; + +itemName: String; + +itemValue: String?; + +type: ContactItemType?; + +iconColor: Color? + | + +dynamic launchContact(); + +Widget build() + ] + + [ContactItem]o-[IconData] + [ContactItem]o-[ContactItemType] + [ContactItem]o-[Color] + + [ContactItemType + | + +index: int; + <static>+values: List<ContactItemType>; + <static>+website: ContactItemType; + <static>+email: ContactItemType; + <static>+phone: ContactItemType + ] + + [ContactItemType]o-[ContactItemType] + [Enum]<:--[ContactItemType] [LinearRegressionSectionWidget | @@ -53,19 +189,15 @@ +intervention: String ] - [ReportHistoryScreen - | - +Widget build() - ] - - [ReportHistoryItem + [ReportDetailsScreen | +subject: StudySubject | + <static>+MaterialPageRoute<dynamic> routeFor(); +Widget build() ] - [ReportHistoryItem]o-[StudySubject] + [ReportDetailsScreen]o-[StudySubject] [<abstract>GenericSection | @@ -86,30 +218,26 @@ [<abstract>GenericSection]<:-[GeneralDetailsSection] - [<abstract>ReportSectionWidget + [PerformanceSection | - +subject: StudySubject + +minimumRatio: double; + +maximum: double + | + +Widget buildContent(); + +String getPowerLevelDescription(); + +int getCountableObservationAmount() ] - [<abstract>ReportSectionWidget]o-[StudySubject] + [<abstract>GenericSection]<:-[PerformanceSection] - [ReportSectionContainer + [PerformanceBar | - <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)>; - +section: ReportSection; - +subject: StudySubject; - +primary: bool; - +onTap: void Function()? + +progress: double; + +minimum: double? | - +ReportSectionWidget buildContents(); - +List<Widget> buildPrimaryHeader(); +Widget build() ] - [ReportSectionContainer]o-[<abstract>ReportSection] - [ReportSectionContainer]o-[StudySubject] - [ReportSectionContainer]o-[void Function()?] - [PerformanceDetailsScreen | +reportSubject: StudySubject? @@ -153,43 +281,50 @@ [PerformanceBar]o-[<abstract>Task] - [PerformanceSection - | - +minimumRatio: double; - +maximum: double + [ReportHistoryScreen | - +Widget buildContent(); - +String getPowerLevelDescription(); - +int getCountableObservationAmount() + +Widget build() ] - [<abstract>GenericSection]<:-[PerformanceSection] - - [PerformanceBar + [ReportHistoryItem | - +progress: double; - +minimum: double? + +subject: StudySubject | +Widget build() ] - [TaskScreen + [ReportHistoryItem]o-[StudySubject] + + [<abstract>ReportSectionWidget | - +taskInstance: TaskInstance + +subject: StudySubject + ] + + [<abstract>ReportSectionWidget]o-[StudySubject] + + [ReportSectionContainer | - <static>+MaterialPageRoute<bool> routeFor() + <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)>; + +section: ReportSection; + +subject: StudySubject; + +primary: bool; + +onTap: void Function()? + | + +ReportSectionWidget buildContents(); + +List<Widget> buildPrimaryHeader(); + +Widget build() ] - [TaskScreen]o-[TaskInstance] + [ReportSectionContainer]o-[<abstract>ReportSection] + [ReportSectionContainer]o-[StudySubject] + [ReportSectionContainer]o-[void Function()?] - [QuestionnaireTaskWidget + [DisclaimerSection | - +task: QuestionnaireTask; - +completionPeriod: CompletionPeriod + +Widget buildContent() ] - [QuestionnaireTaskWidget]o-[QuestionnaireTask] - [QuestionnaireTaskWidget]o-[CompletionPeriod] + [<abstract>GenericSection]<:-[DisclaimerSection] [CheckmarkTaskWidget | @@ -200,40 +335,23 @@ [CheckmarkTaskWidget]o-[CheckmarkTask] [CheckmarkTaskWidget]o-[CompletionPeriod] - [StudyOverviewScreen - ] - - [_StudyOverviewScreen + [TaskScreen | - +study: Study? + +taskInstance: TaskInstance | - +dynamic navigateToJourney(); - +dynamic navigateToEligibilityCheck(); - +Widget build() + <static>+MaterialPageRoute<bool> routeFor() ] - [_StudyOverviewScreen]o-[Study] + [TaskScreen]o-[TaskInstance] - [StudyDetailsView - | - +study: Study?; - +iconSize: double + [QuestionnaireTaskWidget | - +Widget build() + +task: QuestionnaireTask; + +completionPeriod: CompletionPeriod ] - [StudyDetailsView]o-[Study] - - [StudySelectionScreen - | - +Widget build() - ] - - [InviteCodeDialog - ] - - [InterventionSelectionScreen - ] + [QuestionnaireTaskWidget]o-[QuestionnaireTask] + [QuestionnaireTaskWidget]o-[CompletionPeriod] [KickoffScreen ] @@ -251,6 +369,23 @@ [_KickoffScreen]o-[StudySubject] + [EligibilityResult + | + +eligible: bool; + +firstFailed: EligibilityCriterion? + ] + + [EligibilityResult]o-[EligibilityCriterion] + + [EligibilityScreen + | + +study: Study? + | + <static>+MaterialPageRoute<EligibilityResult> routeFor() + ] + + [EligibilityScreen]o-[Study] + [JourneyOverviewScreen ] @@ -306,6 +441,15 @@ [TimelineChild]o-[<abstract>Widget] + [OnboardingProgress + | + +stage: int; + +progress: double + | + -double _getProgressForStage(); + +Widget build() + ] + [ConsentScreen ] @@ -332,1429 +476,1367 @@ [ConsentElement]o-[IconData] - [EligibilityResult - | - +eligible: bool; - +firstFailed: EligibilityCriterion? - ] - - [EligibilityResult]o-[EligibilityCriterion] - - [EligibilityScreen - | - +study: Study? - | - <static>+MaterialPageRoute<EligibilityResult> routeFor() - ] - - [EligibilityScreen]o-[Study] - - [OnboardingProgress - | - +stage: int; - +progress: double - | - -double _getProgressForStage(); - +Widget build() - ] - - [TaskOverview - | - +subject: StudySubject?; - +scheduleToday: List<TaskInstance>?; - +interventionIcon: String? - ] - - [TaskOverview]o-[StudySubject] - - [ProgressRow - | - +subject: StudySubject? - ] - - [ProgressRow]o-[StudySubject] - - [InterventionSegment - | - +intervention: Intervention; - +percentCompleted: double; - +percentMissed: double; - +isCurrent: bool; - +isFuture: bool; - +phaseDuration: int - | - +List<Widget> buildSeparators(); - +Widget build() - ] - - [InterventionSegment]o-[Intervention] - - [TaskBox - | - +taskInstance: TaskInstance; - +icon: Icon; - +onCompleted: dynamic Function() - ] - - [TaskBox]o-[TaskInstance] - [TaskBox]o-[Icon] - [TaskBox]o-[dynamic Function()] - - [Settings - ] - - [OptOutAlertDialog - | - +subject: StudySubject? - | - +Widget build() - ] - - [OptOutAlertDialog]o-[StudySubject] - - [DeleteAlertDialog - | - +subject: StudySubject? - | - +Widget build() - ] - - [DeleteAlertDialog]o-[StudySubject] - - [ContactScreen + [InterventionSelectionScreen ] - [ContactWidget - | - +contact: Contact?; - +title: String; - +subtitle: String?; - +color: Color - | - +Widget build() + [StudyOverviewScreen ] - [ContactWidget]o-[Contact] - [ContactWidget]o-[Color] - - [ContactItem + [_StudyOverviewScreen | - +iconData: IconData; - +itemName: String; - +itemValue: String?; - +type: ContactItemType?; - +iconColor: Color? + +study: Study? | - +dynamic launchContact(); + +dynamic navigateToJourney(); + +dynamic navigateToEligibilityCheck(); +Widget build() ] - [ContactItem]o-[IconData] - [ContactItem]o-[ContactItemType] - [ContactItem]o-[Color] + [_StudyOverviewScreen]o-[Study] - [ContactItemType + [StudyDetailsView | - +index: int; - <static>+values: List<ContactItemType>; - <static>+website: ContactItemType; - <static>+email: ContactItemType; - <static>+phone: ContactItemType - ] - - [ContactItemType]o-[ContactItemType] - [Enum]<:--[ContactItemType] - - [FAQ + +study: Study?; + +iconSize: double | +Widget build() ] - [Entry - | - +title: String; - +children: List<Entry> - ] + [StudyDetailsView]o-[Study] - [EntryItem - | - +entry: Entry + [StudySelectionScreen | - -Widget _buildTiles(); +Widget build() ] - [EntryItem]o-[Entry] - - [DashboardScreen - | - +error: String? - ] - - [OverflowMenuItem - | - +name: String; - +icon: IconData; - +routeName: String?; - +onTap: dynamic Function()? - ] - - [OverflowMenuItem]o-[IconData] - [OverflowMenuItem]o-[dynamic Function()?] - - [StudyFinishedPlaceholder - | - <static>+space: SizedBox - | - +Widget build() + [InviteCodeDialog ] - [StudyFinishedPlaceholder]o-[SizedBox] - - + - - - + - + - + - + - - - + - + - - - + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - - - + + - + + - + - + + + - + - + + + - + - + - + - + - + - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + + - - + - + - + - + - + - + - + - + - - - - + + + + - - - DisclaimerSection + + + DashboardScreen - - - +Widget buildContent() + + + +error: String? - - - - - + + + + - - - GenericSection + + + OverflowMenuItem - - - +subject: StudySubject? - +onTap: void Function()? + + + +name: String + +icon: IconData + +routeName: String? + +onTap: dynamic Function()? - - - +Widget buildContent() - +Widget build() + + + + + + + + IconData - - - - - + + + - - - ReportDetailsScreen + + + dynamic Function()? - - - +subject: StudySubject + + + + + + + + + + StudyFinishedPlaceholder - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() + + + <static>+space: SizedBox + + + + + + +Widget build() - - - + + + - - - StudySubject + + + SizedBox - - - - - + + + + - - - LinearRegressionSectionWidget + + + TaskBox - - - +section: LinearRegressionSection + + + +taskInstance: TaskInstance + +icon: Icon + +onCompleted: dynamic Function() - - - +Widget build() + + + + + + + + TaskInstance - - - + + + - - - LinearRegressionSection + + + Icon - - - - + + + - - - ReportSectionWidget + + + dynamic Function() - - - +subject: StudySubject + + + + + + + + + ProgressRow + + + + + + +subject: StudySubject? - - - - - + + + - - - AverageSectionWidget + + + StudySubject - - - +section: AverageSection - +titlePos: List<int> - +phasePos: List<int> + + + + + + + + + + InterventionSegment - - - +Widget build() - +Widget getDiagram() - +BarChartData getChartData() - +Widget getTitles() - +Widget getValues() - +List<BarChartGroupData> getBarGroups() - +MaterialColor getColor() - +Iterable<DiagramDatum> getAggregatedData() + + + +intervention: Intervention + +percentCompleted: double + +percentMissed: double + +isCurrent: bool + +isFuture: bool + +phaseDuration: int + + + + + + +List<Widget> buildSeparators() + +Widget build() - - - + + + - - - AverageSection + + + Intervention - - - - + + + + - - - DiagramDatum + + + TaskOverview - - - +x: num - +value: num - +timestamp: DateTime? - +intervention: String + + + +subject: StudySubject? + +scheduleToday: List<TaskInstance>? + +interventionIcon: String? - - - - + + + - - - ReportHistoryScreen + + + Settings - - - +Widget build() + + + + + + + + + + OptOutAlertDialog + + + + + + +subject: StudySubject? + + + + + + +Widget build() - - - - - + + + + + - - - ReportHistoryItem + + + DeleteAlertDialog - - - +subject: StudySubject + + + +subject: StudySubject? - - - +Widget build() + + + +Widget build() - - - + + + + - - - void Function()? + + + FAQ + + + + + + +Widget build() - - - - + + + + - - - GeneralDetailsSection + + + Entry - - - +Widget buildContent() + + + +title: String + +children: List<Entry> - - - - - + + + + + - - - ReportSectionContainer + + + EntryItem - - - <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)> - +section: ReportSection - +subject: StudySubject - +primary: bool - +onTap: void Function()? + + + +entry: Entry - - - +ReportSectionWidget buildContents() - +List<Widget> buildPrimaryHeader() - +Widget build() + + + -Widget _buildTiles() + +Widget build() - - - + + + - - - ReportSection + + + ContactScreen - - - - - + + + + + - - - PerformanceDetailsScreen + + + ContactWidget - - - +reportSubject: StudySubject? + + + +contact: Contact? + +title: String + +subtitle: String? + +color: Color - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() + + + +Widget build() - - - - - + + + - - - InterventionPerformanceBar + + + Contact - - - +intervention: Intervention - +subject: StudySubject? - - + + + + - - - +Widget build() + + + Color - - - + + + + + - - - Intervention + + + ContactItem - - - - - - + + + +iconData: IconData + +itemName: String + +itemValue: String? + +type: ContactItemType? + +iconColor: Color? + + - - - ObservationPerformanceBar + + + +dynamic launchContact() + +Widget build() - - - +observation: Observation - +subject: StudySubject? + + + + + + + + + ContactItemType - - - +Widget build() + + + +index: int + <static>+values: List<ContactItemType> + <static>+website: ContactItemType + <static>+email: ContactItemType + <static>+phone: ContactItemType - - - + + + - - - Observation + + + Enum - - - - - + + + + + - - - PerformanceBar + + + LinearRegressionSectionWidget - - - +task: Task - +completed: int - +total: int + + + +section: LinearRegressionSection - - - +Widget build() + + + +Widget build() - - - + + + - - - Task + + + LinearRegressionSection - - - - - - - - - PerformanceSection - - + + + + - - - +minimumRatio: double - +maximum: double + + + ReportSectionWidget - - - +Widget buildContent() - +String getPowerLevelDescription() - +int getCountableObservationAmount() + + + +subject: StudySubject - - - - - - + + + + + + - - - TaskScreen + + + AverageSectionWidget - - - +taskInstance: TaskInstance + + + +section: AverageSection + +titlePos: List<int> + +phasePos: List<int> - - - <static>+MaterialPageRoute<bool> routeFor() + + + +Widget build() + +Widget getDiagram() + +BarChartData getChartData() + +Widget getTitles() + +Widget getValues() + +List<BarChartGroupData> getBarGroups() + +MaterialColor getColor() + +Iterable<DiagramDatum> getAggregatedData() - - - + + + - - - TaskInstance + + + AverageSection - - - - + + + + - - - QuestionnaireTaskWidget + + + DiagramDatum - - - +task: QuestionnaireTask - +completionPeriod: CompletionPeriod + + + +x: num + +value: num + +timestamp: DateTime? + +intervention: String - - - + + + + + - - - QuestionnaireTask + + + ReportDetailsScreen - - - - + + + +subject: StudySubject + + - - - CompletionPeriod + + + <static>+MaterialPageRoute<dynamic> routeFor() + +Widget build() - - - - + + + + + - - - CheckmarkTaskWidget + + + GenericSection - - - +task: CheckmarkTask? - +completionPeriod: CompletionPeriod? + + + +subject: StudySubject? + +onTap: void Function()? - - - - - - - - CheckmarkTask + + + +Widget buildContent() + +Widget build() - - - + + + - - - StudyOverviewScreen + + + void Function()? - - - - - + + + + - - - _StudyOverviewScreen + + + GeneralDetailsSection - - - +study: Study? + + + +Widget buildContent() - - - +dynamic navigateToJourney() - +dynamic navigateToEligibilityCheck() - +Widget build() + + + + + + + + + + PerformanceSection - - - - + + + +minimumRatio: double + +maximum: double + + - - - Study + + + +Widget buildContent() + +String getPowerLevelDescription() + +int getCountableObservationAmount() - - - - - + + + + + - - - StudyDetailsView + + + PerformanceBar - - - +study: Study? - +iconSize: double + + + +progress: double + +minimum: double? - - - +Widget build() + + + +Widget build() - - - - + + + + + - - - StudySelectionScreen + + + PerformanceDetailsScreen - - - +Widget build() + + + +reportSubject: StudySubject? - - - - - - - - InviteCodeDialog + + + <static>+MaterialPageRoute<dynamic> routeFor() + +Widget build() - - - + + + + + - - - InterventionSelectionScreen + + + InterventionPerformanceBar - - - - + + + +intervention: Intervention + +subject: StudySubject? + + - - - KickoffScreen + + + +Widget build() - - - - - + + + + + - - - _KickoffScreen + + + ObservationPerformanceBar - - - +subject: StudySubject? - +ready: bool + + + +observation: Observation + +subject: StudySubject? - - - -dynamic _storeUserStudy() - -Widget _constructStatusIcon() - -String _getStatusText() - +Widget build() + + + +Widget build() - - - + + + - - - JourneyOverviewScreen + + + Observation - - - - - + + + - - - _JourneyOverviewScreen + + + Task - - - +subject: StudySubject? + + + + + + + + + ReportHistoryScreen - - - +dynamic getConsentAndNavigateToDashboard() - +Widget build() + + + +Widget build() - - - - - + + + + + - - - Timeline + + + ReportHistoryItem - - - +subject: StudySubject? + + + +subject: StudySubject - - - - +Widget build() + + + + +Widget build() - - - - - + + + + + - - - InterventionTile + + + ReportSectionContainer - - - +title: String? - +iconName: String - +date: DateTime - +color: Color? - +isFirst: bool - +isLast: bool + + + <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)> + +section: ReportSection + +subject: StudySubject + +primary: bool + +onTap: void Function()? - - - +Widget build() + + + +ReportSectionWidget buildContents() + +List<Widget> buildPrimaryHeader() + +Widget build() - - - + + + - - - Color + + + ReportSection - - - - - - - - - IconIndicator - - + + + + - - - +iconName: String - +color: Color? + + + DisclaimerSection - - - +Widget build() + + + +Widget buildContent() - - - - - + + + + - - - TimelineChild + + + CheckmarkTaskWidget - - - +child: Widget? + + + +task: CheckmarkTask? + +completionPeriod: CompletionPeriod? - - - +Widget build() + + + + + + + + CheckmarkTask - - - + + + - - - Widget + + + CompletionPeriod - - - + + + + + - - - ConsentScreen + + + TaskScreen - - - - - - + + + +taskInstance: TaskInstance + + - - - ConsentCard + + + <static>+MaterialPageRoute<bool> routeFor() - - - +consent: ConsentItem? - +index: int? - +onTapped: dynamic Function(int) - +isChecked: bool? + + + + + + + + + QuestionnaireTaskWidget - - - +Widget build() + + + +task: QuestionnaireTask + +completionPeriod: CompletionPeriod - - - + + + - - - ConsentItem + + + QuestionnaireTask - - - + + + - - - dynamic Function(int) + + + KickoffScreen - - - - + + + + + - - - ConsentElement + + + _KickoffScreen - - - +title: String - +descriptionText: String - +acknowledgmentText: String - +icon: IconData + + + +subject: StudySubject? + +ready: bool - - - - - - - - IconData + + + -dynamic _storeUserStudy() + -Widget _constructStatusIcon() + -String _getStatusText() + +Widget build() - - + + - + EligibilityResult - + +eligible: bool +firstFailed: EligibilityCriterion? @@ -1764,9 +1846,9 @@ - + - + EligibilityCriterion @@ -1775,486 +1857,403 @@ - - - + + + - + EligibilityScreen - + +study: Study? - + <static>+MaterialPageRoute<EligibilityResult> routeFor() - - - - - - - - - OnboardingProgress - - - - - - +stage: int - +progress: double - - - - - - -double _getProgressForStage() - +Widget build() - - - - - - - - - - - - TaskOverview - - + + + - - - +subject: StudySubject? - +scheduleToday: List<TaskInstance>? - +interventionIcon: String? + + + Study - - - - - - - - ProgressRow - - + + + - - - +subject: StudySubject? + + + JourneyOverviewScreen - - - - - + + + + + - - - InterventionSegment + + + _JourneyOverviewScreen - - - +intervention: Intervention - +percentCompleted: double - +percentMissed: double - +isCurrent: bool - +isFuture: bool - +phaseDuration: int + + + +subject: StudySubject? - - - +List<Widget> buildSeparators() - +Widget build() + + + +dynamic getConsentAndNavigateToDashboard() + +Widget build() - - - - + + + + + - - - TaskBox + + + Timeline - - - +taskInstance: TaskInstance - +icon: Icon - +onCompleted: dynamic Function() + + + +subject: StudySubject? - - - - - - - - Icon + + + +Widget build() - - - + + + + + - - - dynamic Function() + + + InterventionTile - - - - + + + +title: String? + +iconName: String + +date: DateTime + +color: Color? + +isFirst: bool + +isLast: bool + + - - - Settings + + + +Widget build() - - - - - + + + + + - - - OptOutAlertDialog + + + IconIndicator - - - +subject: StudySubject? + + + +iconName: String + +color: Color? - - - +Widget build() + + + +Widget build() - - - - - + + + + + - - - DeleteAlertDialog + + + TimelineChild - - - +subject: StudySubject? + + + +child: Widget? - - - +Widget build() + + + +Widget build() - - - + + + - - - ContactScreen + + + Widget - - - - - + + + + + - - - ContactWidget + + + OnboardingProgress - - - +contact: Contact? - +title: String - +subtitle: String? - +color: Color + + + +stage: int + +progress: double - - - +Widget build() + + + -double _getProgressForStage() + +Widget build() - - - + + + - - - Contact + + + ConsentScreen - - - - - + + + + + - - - ContactItem + + + ConsentCard - - - +iconData: IconData - +itemName: String - +itemValue: String? - +type: ContactItemType? - +iconColor: Color? + + + +consent: ConsentItem? + +index: int? + +onTapped: dynamic Function(int) + +isChecked: bool? - - - +dynamic launchContact() - +Widget build() + + + +Widget build() - - - - - - - - ContactItemType - - + + + - - - +index: int - <static>+values: List<ContactItemType> - <static>+website: ContactItemType - <static>+email: ContactItemType - <static>+phone: ContactItemType + + + ConsentItem - - - + + + - - - Enum + + + dynamic Function(int) - - - - + + + + - - - FAQ + + + ConsentElement - - - +Widget build() + + + +title: String + +descriptionText: String + +acknowledgmentText: String + +icon: IconData - - - - - - - - Entry - - + + + - - - +title: String - +children: List<Entry> + + + InterventionSelectionScreen - - - - - + + + - - - EntryItem + + + StudyOverviewScreen - - - +entry: Entry - - + + + + + + - - - -Widget _buildTiles() - +Widget build() + + + _StudyOverviewScreen - - - - - - - - - DashboardScreen + + + +study: Study? - - - +error: String? + + + +dynamic navigateToJourney() + +dynamic navigateToEligibilityCheck() + +Widget build() - - - - + + + + + - - - OverflowMenuItem + + + StudyDetailsView - - - +name: String - +icon: IconData - +routeName: String? - +onTap: dynamic Function()? + + + +study: Study? + +iconSize: double - - - - - - - - dynamic Function()? + + + +Widget build() - - - - - - - - - StudyFinishedPlaceholder - - + + + + - - - <static>+space: SizedBox + + + StudySelectionScreen - - - +Widget build() + + + +Widget build() - - - + + + - - - SizedBox + + + InviteCodeDialog diff --git a/docs/uml/app/lib/screens/uml.svg b/docs/uml/app/lib/screens/uml.svg index 86ba73797..36f78b9e2 100644 --- a/docs/uml/app/lib/screens/uml.svg +++ b/docs/uml/app/lib/screens/uml.svg @@ -1,5 +1,10 @@ - - [Preview + + [AboutScreen + | + +Widget build() + ] + + [Preview | +queryParameters: Map<String, String>?; +appLanguage: AppLanguage; @@ -26,9 +31,10 @@ [Preview]o-[Study] [Preview]o-[StudySubject] - [WelcomeScreen + [IFrameHelper | - +Widget build() + +void postRouteFinished(); + +void listen() ] [TermsScreen @@ -51,39 +57,169 @@ [LegalSection]o-[Icon] [LegalSection]o-[void Function(bool?)?] - [IFrameHelper + [LoadingScreen | - +void postRouteFinished(); - +void listen() + +sessionString: String?; + +queryParameters: Map<String, String>? ] - [AboutScreen + [WelcomeScreen | +Widget build() ] - [LoadingScreen + [DashboardScreen | - +sessionString: String?; - +queryParameters: Map<String, String>? + +error: String? ] - [DisclaimerSection + [OverflowMenuItem | - +Widget buildContent() + +name: String; + +icon: IconData; + +routeName: String?; + +onTap: dynamic Function()? ] - [<abstract>GenericSection]<:-[DisclaimerSection] + [OverflowMenuItem]o-[IconData] + [OverflowMenuItem]o-[dynamic Function()?] - [ReportDetailsScreen + [StudyFinishedPlaceholder | - +subject: StudySubject + <static>+space: SizedBox | - <static>+MaterialPageRoute<dynamic> routeFor(); +Widget build() ] - [ReportDetailsScreen]o-[StudySubject] + [StudyFinishedPlaceholder]o-[SizedBox] + + [TaskBox + | + +taskInstance: TaskInstance; + +icon: Icon; + +onCompleted: dynamic Function() + ] + + [TaskBox]o-[TaskInstance] + [TaskBox]o-[Icon] + [TaskBox]o-[dynamic Function()] + + [ProgressRow + | + +subject: StudySubject? + ] + + [ProgressRow]o-[StudySubject] + + [InterventionSegment + | + +intervention: Intervention; + +percentCompleted: double; + +percentMissed: double; + +isCurrent: bool; + +isFuture: bool; + +phaseDuration: int + | + +List<Widget> buildSeparators(); + +Widget build() + ] + + [InterventionSegment]o-[Intervention] + + [TaskOverview + | + +subject: StudySubject?; + +scheduleToday: List<TaskInstance>?; + +interventionIcon: String? + ] + + [TaskOverview]o-[StudySubject] + + [Settings + ] + + [OptOutAlertDialog + | + +subject: StudySubject? + | + +Widget build() + ] + + [OptOutAlertDialog]o-[StudySubject] + + [DeleteAlertDialog + | + +subject: StudySubject? + | + +Widget build() + ] + + [DeleteAlertDialog]o-[StudySubject] + + [FAQ + | + +Widget build() + ] + + [Entry + | + +title: String; + +children: List<Entry> + ] + + [EntryItem + | + +entry: Entry + | + -Widget _buildTiles(); + +Widget build() + ] + + [EntryItem]o-[Entry] + + [ContactScreen + ] + + [ContactWidget + | + +contact: Contact?; + +title: String; + +subtitle: String?; + +color: Color + | + +Widget build() + ] + + [ContactWidget]o-[Contact] + [ContactWidget]o-[Color] + + [ContactItem + | + +iconData: IconData; + +itemName: String; + +itemValue: String?; + +type: ContactItemType?; + +iconColor: Color? + | + +dynamic launchContact(); + +Widget build() + ] + + [ContactItem]o-[IconData] + [ContactItem]o-[ContactItemType] + [ContactItem]o-[Color] + + [ContactItemType + | + +index: int; + <static>+values: List<ContactItemType>; + <static>+website: ContactItemType; + <static>+email: ContactItemType; + <static>+phone: ContactItemType + ] + + [ContactItemType]o-[ContactItemType] + [Enum]<:--[ContactItemType] [LinearRegressionSectionWidget | @@ -122,19 +258,15 @@ +intervention: String ] - [ReportHistoryScreen - | - +Widget build() - ] - - [ReportHistoryItem + [ReportDetailsScreen | +subject: StudySubject | + <static>+MaterialPageRoute<dynamic> routeFor(); +Widget build() ] - [ReportHistoryItem]o-[StudySubject] + [ReportDetailsScreen]o-[StudySubject] [<abstract>GenericSection | @@ -155,30 +287,26 @@ [<abstract>GenericSection]<:-[GeneralDetailsSection] - [<abstract>ReportSectionWidget + [PerformanceSection | - +subject: StudySubject + +minimumRatio: double; + +maximum: double + | + +Widget buildContent(); + +String getPowerLevelDescription(); + +int getCountableObservationAmount() ] - [<abstract>ReportSectionWidget]o-[StudySubject] + [<abstract>GenericSection]<:-[PerformanceSection] - [ReportSectionContainer + [PerformanceBar | - <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)>; - +section: ReportSection; - +subject: StudySubject; - +primary: bool; - +onTap: void Function()? + +progress: double; + +minimum: double? | - +ReportSectionWidget buildContents(); - +List<Widget> buildPrimaryHeader(); +Widget build() ] - [ReportSectionContainer]o-[<abstract>ReportSection] - [ReportSectionContainer]o-[StudySubject] - [ReportSectionContainer]o-[void Function()?] - [PerformanceDetailsScreen | +reportSubject: StudySubject? @@ -222,26 +350,60 @@ [PerformanceBar]o-[<abstract>Task] - [PerformanceSection + [ReportHistoryScreen | - +minimumRatio: double; - +maximum: double + +Widget build() + ] + + [ReportHistoryItem | - +Widget buildContent(); - +String getPowerLevelDescription(); - +int getCountableObservationAmount() + +subject: StudySubject + | + +Widget build() ] - [<abstract>GenericSection]<:-[PerformanceSection] + [ReportHistoryItem]o-[StudySubject] - [PerformanceBar + [<abstract>ReportSectionWidget | - +progress: double; - +minimum: double? + +subject: StudySubject + ] + + [<abstract>ReportSectionWidget]o-[StudySubject] + + [ReportSectionContainer + | + <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)>; + +section: ReportSection; + +subject: StudySubject; + +primary: bool; + +onTap: void Function()? | + +ReportSectionWidget buildContents(); + +List<Widget> buildPrimaryHeader(); +Widget build() ] + [ReportSectionContainer]o-[<abstract>ReportSection] + [ReportSectionContainer]o-[StudySubject] + [ReportSectionContainer]o-[void Function()?] + + [DisclaimerSection + | + +Widget buildContent() + ] + + [<abstract>GenericSection]<:-[DisclaimerSection] + + [CheckmarkTaskWidget + | + +task: CheckmarkTask?; + +completionPeriod: CompletionPeriod? + ] + + [CheckmarkTaskWidget]o-[CheckmarkTask] + [CheckmarkTaskWidget]o-[CompletionPeriod] + [TaskScreen | +taskInstance: TaskInstance @@ -260,65 +422,38 @@ [QuestionnaireTaskWidget]o-[QuestionnaireTask] [QuestionnaireTaskWidget]o-[CompletionPeriod] - [CheckmarkTaskWidget - | - +task: CheckmarkTask?; - +completionPeriod: CompletionPeriod? - ] - - [CheckmarkTaskWidget]o-[CheckmarkTask] - [CheckmarkTaskWidget]o-[CompletionPeriod] - - [StudyOverviewScreen - ] - - [_StudyOverviewScreen - | - +study: Study? - | - +dynamic navigateToJourney(); - +dynamic navigateToEligibilityCheck(); - +Widget build() + [KickoffScreen ] - [_StudyOverviewScreen]o-[Study] - - [StudyDetailsView + [_KickoffScreen | - +study: Study?; - +iconSize: double + +subject: StudySubject?; + +ready: bool | + -dynamic _storeUserStudy(); + -Widget _constructStatusIcon(); + -String _getStatusText(); +Widget build() ] - [StudyDetailsView]o-[Study] + [_KickoffScreen]o-[StudySubject] - [StudySelectionScreen + [EligibilityResult | - +Widget build() - ] - - [InviteCodeDialog - ] - - [InterventionSelectionScreen + +eligible: bool; + +firstFailed: EligibilityCriterion? ] - [KickoffScreen - ] + [EligibilityResult]o-[EligibilityCriterion] - [_KickoffScreen + [EligibilityScreen | - +subject: StudySubject?; - +ready: bool + +study: Study? | - -dynamic _storeUserStudy(); - -Widget _constructStatusIcon(); - -String _getStatusText(); - +Widget build() + <static>+MaterialPageRoute<EligibilityResult> routeFor() ] - [_KickoffScreen]o-[StudySubject] + [EligibilityScreen]o-[Study] [JourneyOverviewScreen ] @@ -375,6 +510,15 @@ [TimelineChild]o-[<abstract>Widget] + [OnboardingProgress + | + +stage: int; + +progress: double + | + -double _getProgressForStage(); + +Widget build() + ] + [ConsentScreen ] @@ -401,448 +545,322 @@ [ConsentElement]o-[IconData] - [EligibilityResult - | - +eligible: bool; - +firstFailed: EligibilityCriterion? - ] - - [EligibilityResult]o-[EligibilityCriterion] - - [EligibilityScreen - | - +study: Study? - | - <static>+MaterialPageRoute<EligibilityResult> routeFor() - ] - - [EligibilityScreen]o-[Study] - - [OnboardingProgress - | - +stage: int; - +progress: double - | - -double _getProgressForStage(); - +Widget build() - ] - - [TaskOverview - | - +subject: StudySubject?; - +scheduleToday: List<TaskInstance>?; - +interventionIcon: String? - ] - - [TaskOverview]o-[StudySubject] - - [ProgressRow - | - +subject: StudySubject? - ] - - [ProgressRow]o-[StudySubject] - - [InterventionSegment - | - +intervention: Intervention; - +percentCompleted: double; - +percentMissed: double; - +isCurrent: bool; - +isFuture: bool; - +phaseDuration: int - | - +List<Widget> buildSeparators(); - +Widget build() - ] - - [InterventionSegment]o-[Intervention] - - [TaskBox - | - +taskInstance: TaskInstance; - +icon: Icon; - +onCompleted: dynamic Function() - ] - - [TaskBox]o-[TaskInstance] - [TaskBox]o-[Icon] - [TaskBox]o-[dynamic Function()] - - [Settings - ] - - [OptOutAlertDialog - | - +subject: StudySubject? - | - +Widget build() - ] - - [OptOutAlertDialog]o-[StudySubject] - - [DeleteAlertDialog - | - +subject: StudySubject? - | - +Widget build() - ] - - [DeleteAlertDialog]o-[StudySubject] - - [ContactScreen + [InterventionSelectionScreen ] - [ContactWidget - | - +contact: Contact?; - +title: String; - +subtitle: String?; - +color: Color - | - +Widget build() + [StudyOverviewScreen ] - [ContactWidget]o-[Contact] - [ContactWidget]o-[Color] - - [ContactItem + [_StudyOverviewScreen | - +iconData: IconData; - +itemName: String; - +itemValue: String?; - +type: ContactItemType?; - +iconColor: Color? + +study: Study? | - +dynamic launchContact(); + +dynamic navigateToJourney(); + +dynamic navigateToEligibilityCheck(); +Widget build() ] - [ContactItem]o-[IconData] - [ContactItem]o-[ContactItemType] - [ContactItem]o-[Color] + [_StudyOverviewScreen]o-[Study] - [ContactItemType + [StudyDetailsView | - +index: int; - <static>+values: List<ContactItemType>; - <static>+website: ContactItemType; - <static>+email: ContactItemType; - <static>+phone: ContactItemType - ] - - [ContactItemType]o-[ContactItemType] - [Enum]<:--[ContactItemType] - - [FAQ + +study: Study?; + +iconSize: double | +Widget build() ] - [Entry - | - +title: String; - +children: List<Entry> - ] + [StudyDetailsView]o-[Study] - [EntryItem - | - +entry: Entry + [StudySelectionScreen | - -Widget _buildTiles(); +Widget build() ] - [EntryItem]o-[Entry] - - [DashboardScreen - | - +error: String? - ] - - [OverflowMenuItem - | - +name: String; - +icon: IconData; - +routeName: String?; - +onTap: dynamic Function()? - ] - - [OverflowMenuItem]o-[IconData] - [OverflowMenuItem]o-[dynamic Function()?] - - [StudyFinishedPlaceholder - | - <static>+space: SizedBox - | - +Widget build() + [InviteCodeDialog ] - [StudyFinishedPlaceholder]o-[SizedBox] - - + - + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - - - + - + - - - + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - - - + + - + + - + - + + + - + - + + + - + - + - + - + - + - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + + - - + - + - + - + - + - + - + - + + + + + + + + + + AboutScreen + + + + + + +Widget build() + + + - - - + + + - + Preview - + +queryParameters: Map<String, String>? +appLanguage: AppLanguage @@ -854,7 +872,7 @@ - + +bool hasRoute() +void handleQueries() @@ -873,9 +891,9 @@ - + - + AppLanguage @@ -884,9 +902,9 @@ - + - + Study @@ -895,38 +913,39 @@ - + - + StudySubject - - - - + + + + - - - WelcomeScreen + + + IFrameHelper - - - +Widget build() + + + +void postRouteFinished() + +void listen() - + - + TermsScreen @@ -935,17 +954,17 @@ - - - + + + - + LegalSection - + +title: String? +description: String? @@ -958,7 +977,7 @@ - + +Widget build() @@ -967,9 +986,9 @@ - + - + Icon @@ -978,1063 +997,1126 @@ - + - + void Function(bool?)? - - - - + + + + - - - IFrameHelper + + + LoadingScreen - - - +void postRouteFinished() - +void listen() + + + +sessionString: String? + +queryParameters: Map<String, String>? - - - - + + + + - - - AboutScreen + + + WelcomeScreen - - - +Widget build() + + + +Widget build() - - - - + + + + - - - LoadingScreen + + + DashboardScreen - - - +sessionString: String? - +queryParameters: Map<String, String>? + + + +error: String? - - - - + + + + - - - DisclaimerSection + + + OverflowMenuItem - - - +Widget buildContent() + + + +name: String + +icon: IconData + +routeName: String? + +onTap: dynamic Function()? - - - - - + + + - - - GenericSection + + + IconData - - - +subject: StudySubject? - +onTap: void Function()? - - + + + + - - - +Widget buildContent() - +Widget build() + + + dynamic Function()? - - - - - + + + + + - - - ReportDetailsScreen + + + StudyFinishedPlaceholder - - - +subject: StudySubject + + + <static>+space: SizedBox - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() + + + +Widget build() - - - - - + + + - - - LinearRegressionSectionWidget + + + SizedBox - - - +section: LinearRegressionSection + + + + + + + + + TaskBox - - - +Widget build() + + + +taskInstance: TaskInstance + +icon: Icon + +onCompleted: dynamic Function() - - - + + + - - - LinearRegressionSection + + + TaskInstance - - - - + + + - - - ReportSectionWidget + + + dynamic Function() - - - +subject: StudySubject + + + + + + + + + ProgressRow + + + + + + +subject: StudySubject? - - - - - + + + + + - - - AverageSectionWidget + + + InterventionSegment - - - +section: AverageSection - +titlePos: List<int> - +phasePos: List<int> + + + +intervention: Intervention + +percentCompleted: double + +percentMissed: double + +isCurrent: bool + +isFuture: bool + +phaseDuration: int - - - +Widget build() - +Widget getDiagram() - +BarChartData getChartData() - +Widget getTitles() - +Widget getValues() - +List<BarChartGroupData> getBarGroups() - +MaterialColor getColor() - +Iterable<DiagramDatum> getAggregatedData() + + + +List<Widget> buildSeparators() + +Widget build() - - - + + + - - - AverageSection + + + Intervention - - - - + + + + - - - DiagramDatum + + + TaskOverview - - - +x: num - +value: num - +timestamp: DateTime? - +intervention: String + + + +subject: StudySubject? + +scheduleToday: List<TaskInstance>? + +interventionIcon: String? - - - - - - - - ReportHistoryScreen - - + + + - - - +Widget build() + + + Settings - - - - - + + + + + - - - ReportHistoryItem + + + OptOutAlertDialog - - - +subject: StudySubject + + + +subject: StudySubject? - - - +Widget build() + + + +Widget build() - - - + + + + + - - - void Function()? + + + DeleteAlertDialog - - - - - + + + +subject: StudySubject? + + - - - GeneralDetailsSection + + + +Widget build() - - - +Widget buildContent() + + + + + + + + + FAQ - - - - - - - - - - ReportSectionContainer + + + +Widget build() - - - <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)> - +section: ReportSection - +subject: StudySubject - +primary: bool - +onTap: void Function()? + + + + + + + + + Entry - - - +ReportSectionWidget buildContents() - +List<Widget> buildPrimaryHeader() - +Widget build() + + + +title: String + +children: List<Entry> - - - + + + + + - - - ReportSection + + + EntryItem - - - - - - - - - - PerformanceDetailsScreen + + + +entry: Entry - - - +reportSubject: StudySubject? + + + -Widget _buildTiles() + +Widget build() - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() + + + + + + + + ContactScreen - - - - - + + + + + - - - InterventionPerformanceBar + + + ContactWidget - - - +intervention: Intervention - +subject: StudySubject? + + + +contact: Contact? + +title: String + +subtitle: String? + +color: Color - - - +Widget build() + + + +Widget build() - - - + + + - - - Intervention + + + Contact - - - - - + + + - - - ObservationPerformanceBar + + + Color - - - +observation: Observation - +subject: StudySubject? + + + + + + + + + + ContactItem - - - +Widget build() + + + +iconData: IconData + +itemName: String + +itemValue: String? + +type: ContactItemType? + +iconColor: Color? - - - - - - - - Observation + + + +dynamic launchContact() + +Widget build() - - - - - + + + + - - - PerformanceBar + + + ContactItemType - - - +task: Task - +completed: int - +total: int + + + +index: int + <static>+values: List<ContactItemType> + <static>+website: ContactItemType + <static>+email: ContactItemType + <static>+phone: ContactItemType - - - +Widget build() + + + + + + + + Enum - - - + + + + + - - - Task + + + LinearRegressionSectionWidget + + + + + + +section: LinearRegressionSection + + + + + + +Widget build() - - - - - + + + - - - PerformanceSection + + + LinearRegressionSection - - - +minimumRatio: double - +maximum: double + + + + + + + + + ReportSectionWidget - - - +Widget buildContent() - +String getPowerLevelDescription() - +int getCountableObservationAmount() + + + +subject: StudySubject - - - - - + + + + + - - - TaskScreen + + + AverageSectionWidget - - - +taskInstance: TaskInstance + + + +section: AverageSection + +titlePos: List<int> + +phasePos: List<int> - - - <static>+MaterialPageRoute<bool> routeFor() + + + +Widget build() + +Widget getDiagram() + +BarChartData getChartData() + +Widget getTitles() + +Widget getValues() + +List<BarChartGroupData> getBarGroups() + +MaterialColor getColor() + +Iterable<DiagramDatum> getAggregatedData() - - - + + + - - - TaskInstance + + + AverageSection - - - - + + + + - - - QuestionnaireTaskWidget + + + DiagramDatum - - - +task: QuestionnaireTask - +completionPeriod: CompletionPeriod + + + +x: num + +value: num + +timestamp: DateTime? + +intervention: String - - - + + + + + - - - QuestionnaireTask + + + ReportDetailsScreen - - - - + + + +subject: StudySubject + + - - - CompletionPeriod + + + <static>+MaterialPageRoute<dynamic> routeFor() + +Widget build() - - - - + + + + + - - - CheckmarkTaskWidget + + + GenericSection - - - +task: CheckmarkTask? - +completionPeriod: CompletionPeriod? + + + +subject: StudySubject? + +onTap: void Function()? + + + + + + +Widget buildContent() + +Widget build() - - - + + + - - - CheckmarkTask + + + void Function()? - - - + + + + - - - StudyOverviewScreen + + + GeneralDetailsSection + + + + + + +Widget buildContent() - - - - - + + + + + - - - _StudyOverviewScreen + + + PerformanceSection - - - +study: Study? + + + +minimumRatio: double + +maximum: double - - - +dynamic navigateToJourney() - +dynamic navigateToEligibilityCheck() - +Widget build() + + + +Widget buildContent() + +String getPowerLevelDescription() + +int getCountableObservationAmount() - - - - - + + + + + - - - StudyDetailsView + + + PerformanceBar - - - +study: Study? - +iconSize: double + + + +progress: double + +minimum: double? - - - +Widget build() + + + +Widget build() - - - - + + + + + - - - StudySelectionScreen + + + PerformanceDetailsScreen - - - +Widget build() + + + +reportSubject: StudySubject? - - - - - - - - InviteCodeDialog + + + <static>+MaterialPageRoute<dynamic> routeFor() + +Widget build() - - - + + + + + - - - InterventionSelectionScreen + + + InterventionPerformanceBar - - - - + + + +intervention: Intervention + +subject: StudySubject? + + - - - KickoffScreen + + + +Widget build() - - - - - + + + + + - - - _KickoffScreen + + + ObservationPerformanceBar - - - +subject: StudySubject? - +ready: bool + + + +observation: Observation + +subject: StudySubject? - - - -dynamic _storeUserStudy() - -Widget _constructStatusIcon() - -String _getStatusText() - +Widget build() + + + +Widget build() - - - + + + - - - JourneyOverviewScreen + + + Observation - - - - - + + + - - - _JourneyOverviewScreen + + + Task - - - +subject: StudySubject? + + + + + + + + + ReportHistoryScreen - - - +dynamic getConsentAndNavigateToDashboard() - +Widget build() + + + +Widget build() - - - - - - - - - Timeline + + + + + + + + + ReportHistoryItem - - - +subject: StudySubject? + + + +subject: StudySubject - - - +Widget build() + + + +Widget build() - - - - - + + + + + - - - InterventionTile + + + ReportSectionContainer - - - +title: String? - +iconName: String - +date: DateTime - +color: Color? - +isFirst: bool - +isLast: bool + + + <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)> + +section: ReportSection + +subject: StudySubject + +primary: bool + +onTap: void Function()? - - - +Widget build() + + + +ReportSectionWidget buildContents() + +List<Widget> buildPrimaryHeader() + +Widget build() - - - + + + - - - Color + + + ReportSection - - - - - - - - - IconIndicator - - + + + + - - - +iconName: String - +color: Color? + + + DisclaimerSection - - - +Widget build() + + + +Widget buildContent() - - - - - + + + + - - - TimelineChild + + + CheckmarkTaskWidget - - - +child: Widget? + + + +task: CheckmarkTask? + +completionPeriod: CompletionPeriod? - - - +Widget build() + + + + + + + + CheckmarkTask - - - + + + - - - Widget + + + CompletionPeriod - - - + + + + + - - - ConsentScreen + + + TaskScreen - - - - - - + + + +taskInstance: TaskInstance + + - - - ConsentCard + + + <static>+MaterialPageRoute<bool> routeFor() - - - +consent: ConsentItem? - +index: int? - +onTapped: dynamic Function(int) - +isChecked: bool? + + + + + + + + + QuestionnaireTaskWidget - - - +Widget build() + + + +task: QuestionnaireTask + +completionPeriod: CompletionPeriod - - - + + + - - - ConsentItem + + + QuestionnaireTask - - - + + + - - - dynamic Function(int) + + + KickoffScreen - - - - + + + + + - - - ConsentElement + + + _KickoffScreen - - - +title: String - +descriptionText: String - +acknowledgmentText: String - +icon: IconData + + + +subject: StudySubject? + +ready: bool - - - - - - - - IconData + + + -dynamic _storeUserStudy() + -Widget _constructStatusIcon() + -String _getStatusText() + +Widget build() - - + + - + EligibilityResult - + +eligible: bool +firstFailed: EligibilityCriterion? @@ -2044,9 +2126,9 @@ - + - + EligibilityCriterion @@ -2055,475 +2137,392 @@ - - - + + + - + EligibilityScreen - + +study: Study? - + <static>+MaterialPageRoute<EligibilityResult> routeFor() - - - - - - - - - OnboardingProgress - - - - - - +stage: int - +progress: double - - + + + - - - -double _getProgressForStage() - +Widget build() + + + JourneyOverviewScreen - - - - - - - - TaskOverview - - + + + + + - - - +subject: StudySubject? - +scheduleToday: List<TaskInstance>? - +interventionIcon: String? + + + _JourneyOverviewScreen - - - - - - - - - ProgressRow + + + +subject: StudySubject? - - - +subject: StudySubject? + + + +dynamic getConsentAndNavigateToDashboard() + +Widget build() - - - - - - - - - InterventionSegment - - - - - - +intervention: Intervention - +percentCompleted: double - +percentMissed: double - +isCurrent: bool - +isFuture: bool - +phaseDuration: int - - + + + + + - - - +List<Widget> buildSeparators() - +Widget build() + + + Timeline - - - - - - - - - TaskBox + + + +subject: StudySubject? - - - +taskInstance: TaskInstance - +icon: Icon - +onCompleted: dynamic Function() + + + +Widget build() - - - + + + + + - - - dynamic Function() + + + InterventionTile - - - - + + + +title: String? + +iconName: String + +date: DateTime + +color: Color? + +isFirst: bool + +isLast: bool + + - - - Settings + + + +Widget build() - - - - - + + + + + - - - OptOutAlertDialog + + + IconIndicator - - - +subject: StudySubject? + + + +iconName: String + +color: Color? - - - +Widget build() + + + +Widget build() - - - - - + + + + + - - - DeleteAlertDialog + + + TimelineChild - - - +subject: StudySubject? + + + +child: Widget? - - - +Widget build() + + + +Widget build() - - - + + + - - - ContactScreen + + + Widget - - - - - + + + + + - - - ContactWidget + + + OnboardingProgress - - - +contact: Contact? - +title: String - +subtitle: String? - +color: Color + + + +stage: int + +progress: double - - - +Widget build() + + + -double _getProgressForStage() + +Widget build() - - - + + + - - - Contact + + + ConsentScreen - - - - - + + + + + - - - ContactItem + + + ConsentCard - - - +iconData: IconData - +itemName: String - +itemValue: String? - +type: ContactItemType? - +iconColor: Color? + + + +consent: ConsentItem? + +index: int? + +onTapped: dynamic Function(int) + +isChecked: bool? - - - +dynamic launchContact() - +Widget build() + + + +Widget build() - - - - - - - - ContactItemType - - + + + - - - +index: int - <static>+values: List<ContactItemType> - <static>+website: ContactItemType - <static>+email: ContactItemType - <static>+phone: ContactItemType + + + ConsentItem - - - + + + - - - Enum + + + dynamic Function(int) - - - - + + + + - - - FAQ + + + ConsentElement - - - +Widget build() + + + +title: String + +descriptionText: String + +acknowledgmentText: String + +icon: IconData - - - - - - - - Entry - - + + + - - - +title: String - +children: List<Entry> + + + InterventionSelectionScreen - - - - - + + + - - - EntryItem + + + StudyOverviewScreen - - - +entry: Entry - - + + + + + + - - - -Widget _buildTiles() - +Widget build() + + + _StudyOverviewScreen - - - - - - - - - DashboardScreen + + + +study: Study? - - - +error: String? + + + +dynamic navigateToJourney() + +dynamic navigateToEligibilityCheck() + +Widget build() - - - - + + + + + - - - OverflowMenuItem + + + StudyDetailsView - - - +name: String - +icon: IconData - +routeName: String? - +onTap: dynamic Function()? + + + +study: Study? + +iconSize: double - - - - - - - - dynamic Function()? + + + +Widget build() - - - - - - - - - StudyFinishedPlaceholder - - + + + + - - - <static>+space: SizedBox + + + StudySelectionScreen - - - +Widget build() + + + +Widget build() - - - + + + - - - SizedBox + + + InviteCodeDialog diff --git a/docs/uml/app/lib/uml.svg b/docs/uml/app/lib/uml.svg index 16e6e384e..f5e066800 100644 --- a/docs/uml/app/lib/uml.svg +++ b/docs/uml/app/lib/uml.svg @@ -1,634 +1,561 @@ - - [ThemeConfig + + [MyApp | - <static>+SliderThemeData coloredSliderTheme() + +queryParameters: Map<String, String>; + +appConfig: AppConfig? ] - [Routes - | - <static>+loading: String; - <static>+preview: String; - <static>+dashboard: String; - <static>+welcome: String; - <static>+about: String; - <static>+terms: String; - <static>+studySelection: String; - <static>+studyOverview: String; - <static>+interventionSelection: String; - <static>+journey: String; - <static>+consent: String; - <static>+kickoff: String; - <static>+contact: String; - <static>+faq: String; - <static>+appSettings: String; - <static>+questionnaire: String; - <static>+reportHistory: String; - <static>+reportDetails: String; - <static>+performanceDetails: String + [MyApp]o-[AppConfig] + + [AboutScreen | - <static>+Route<dynamic> unknownRoute(); - <static>+Route<dynamic>? generateRoute() + +Widget build() ] - [InterventionCard + [Preview | - +intervention: Intervention; - +selected: bool; - +showCheckbox: bool; - +showTasks: bool; - +showDescription: bool; - +onTap: dynamic Function()? + +queryParameters: Map<String, String>?; + +appLanguage: AppLanguage; + +selectedRoute: String?; + +extra: String?; + +study: Study?; + +selectedStudyObjectId: String?; + +subject: StudySubject? | - +Widget build() + +bool hasRoute(); + +void handleQueries(); + +dynamic init(); + +dynamic handleAuthorization(); + +dynamic runCommands(); + +String? getSelectedRoute(); + +bool containsQuery(); + +bool containsQueryPair(); + +dynamic getStudySubject(); + -dynamic _createFakeSubject(); + +List<String> getInterventionIds() ] - [InterventionCard]o-[Intervention] - [InterventionCard]o-[dynamic Function()?] + [Preview]o-[AppLanguage] + [Preview]o-[Study] + [Preview]o-[StudySubject] - [InterventionCardTitle - | - +intervention: Intervention?; - +selected: bool; - +showCheckbox: bool; - +showDescriptionButton: bool; - +onTap: dynamic Function()? + [IFrameHelper | - +Widget build() + +void postRouteFinished(); + +void listen() ] - [InterventionCardTitle]o-[Intervention] - [InterventionCardTitle]o-[dynamic Function()?] + [TermsScreen + ] - [InterventionCardDescription + [LegalSection | - +intervention: Intervention + +title: String?; + +description: String?; + +icon: Icon?; + +pdfUrl: String?; + +pdfUrlLabel: String?; + +acknowledgment: String?; + +isChecked: bool?; + +onChange: void Function(bool?)? | +Widget build() ] - [InterventionCardDescription]o-[Intervention] + [LegalSection]o-[Icon] + [LegalSection]o-[void Function(bool?)?] - [_TaskList - | - +tasks: List<InterventionTask> + [LoadingScreen | - +String scheduleString(); - +Widget build() + +sessionString: String?; + +queryParameters: Map<String, String>? ] - [RoundCheckbox - | - +onChanged: dynamic Function(bool)?; - +value: bool? + [WelcomeScreen | +Widget build() ] - [RoundCheckbox]o-[dynamic Function(bool)?] - - [VisualAnalogueQuestionWidget + [DashboardScreen | - +question: VisualAnalogueQuestion; - +onDone: dynamic Function(Answer<dynamic>)? + +error: String? ] - [VisualAnalogueQuestionWidget]o-[VisualAnalogueQuestion] - [VisualAnalogueQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[VisualAnalogueQuestionWidget] - - [QuestionHeader - | - +prompt: String?; - +subtitle: String?; - +rationale: String? + [OverflowMenuItem | - -List<Widget> _buildSubtitle(); - -List<Widget> _buildRationaleButton(); - +Widget build() + +name: String; + +icon: IconData; + +routeName: String?; + +onTap: dynamic Function()? ] - [QuestionnaireWidget - | - +title: String?; - +header: String?; - +footer: String?; - +questions: List<Question<dynamic>> - ] + [OverflowMenuItem]o-[IconData] + [OverflowMenuItem]o-[dynamic Function()?] - [HtmlTextBox + [StudyFinishedPlaceholder | - +text: String? + <static>+space: SizedBox | +Widget build() ] - [AnnotatedScaleQuestionWidget + [StudyFinishedPlaceholder]o-[SizedBox] + + [TaskBox | - +question: AnnotatedScaleQuestion; - +onDone: dynamic Function(Answer<dynamic>)? + +taskInstance: TaskInstance; + +icon: Icon; + +onCompleted: dynamic Function() ] - [AnnotatedScaleQuestionWidget]o-[AnnotatedScaleQuestion] - [AnnotatedScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[AnnotatedScaleQuestionWidget] + [TaskBox]o-[TaskInstance] + [TaskBox]o-[Icon] + [TaskBox]o-[dynamic Function()] - [BooleanQuestionWidget + [ProgressRow | - +question: BooleanQuestion; - +onDone: dynamic Function(Answer<dynamic>)? + +subject: StudySubject? ] - [BooleanQuestionWidget]o-[BooleanQuestion] - [BooleanQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[BooleanQuestionWidget] + [ProgressRow]o-[StudySubject] - [<abstract>QuestionWidget + [InterventionSegment | - +subtitle: String? - ] - - [ChoiceQuestionWidget + +intervention: Intervention; + +percentCompleted: double; + +percentMissed: double; + +isCurrent: bool; + +isFuture: bool; + +phaseDuration: int | - +question: ChoiceQuestion; - +onDone: dynamic Function(Answer<dynamic>); - +multiSelectionText: String; - +subtitle: String? + +List<Widget> buildSeparators(); + +Widget build() ] - [ChoiceQuestionWidget]o-[ChoiceQuestion] - [ChoiceQuestionWidget]o-[dynamic Function(Answer<dynamic>)] - [<abstract>QuestionWidget]<:-[ChoiceQuestionWidget] + [InterventionSegment]o-[Intervention] - [ScaleQuestionWidget + [TaskOverview | - +question: ScaleQuestion; - +onDone: dynamic Function(Answer<dynamic>)? + +subject: StudySubject?; + +scheduleToday: List<TaskInstance>?; + +interventionIcon: String? ] - [ScaleQuestionWidget]o-[ScaleQuestion] - [ScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[ScaleQuestionWidget] + [TaskOverview]o-[StudySubject] - [QuestionContainer + [Settings + ] + + [OptOutAlertDialog | - +onDone: dynamic Function(Answer<dynamic>, int); - +question: Question<dynamic>; - +index: int + +subject: StudySubject? + | + +Widget build() ] - [QuestionContainer]o-[dynamic Function(Answer<dynamic>, int)] - [QuestionContainer]o-[<abstract>Question] + [OptOutAlertDialog]o-[StudySubject] - [CustomSlider + [DeleteAlertDialog | - +value: double?; - +minValue: double?; - +maxValue: double?; - +minorTick: int?; - +onChanged: dynamic Function(double)?; - +onChangeEnd: dynamic Function(double)?; - +activeColor: Color?; - +inactiveColor: Color?; - +minColor: Color?; - +maxColor: Color?; - +thumbColor: Color?; - +isColored: bool; - +labelValuePrecision: int; - +tickValuePrecision: int; - +linearStep: bool; - +steps: AnnotatedScaleQuestion? + +subject: StudySubject? | +Widget build() ] - [CustomSlider]o-[dynamic Function(double)?] - [CustomSlider]o-[Color] - [CustomSlider]o-[AnnotatedScaleQuestion] + [DeleteAlertDialog]o-[StudySubject] - [CustomTrackShape + [FAQ | - +Rect getPreferredRect() + +Widget build() ] - [RoundedRectSliderTrackShape]<:-[CustomTrackShape] + [Entry + | + +title: String; + +children: List<Entry> + ] - [HtmlText + [EntryItem | - +text: String?; - +style: TextStyle? + +entry: Entry | + -Widget _buildTiles(); +Widget build() ] - [HtmlText]o-[TextStyle] + [EntryItem]o-[Entry] - [StudyTile + [ContactScreen + ] + + [ContactWidget | - +title: String?; - +description: String?; - +iconName: String; - +onTap: dynamic Function()?; - +contentPadding: EdgeInsetsGeometry + +contact: Contact?; + +title: String; + +subtitle: String?; + +color: Color | +Widget build() ] - [StudyTile]o-[dynamic Function()?] - [StudyTile]o-[<abstract>EdgeInsetsGeometry] + [ContactWidget]o-[Contact] + [ContactWidget]o-[Color] - [SelectableButton + [ContactItem | - +child: Widget; - +selected: bool; - +onTap: dynamic Function()? + +iconData: IconData; + +itemName: String; + +itemValue: String?; + +type: ContactItemType?; + +iconColor: Color? | - -Color _getFillColor(); - -Color _getTextColor(); + +dynamic launchContact(); +Widget build() ] - [SelectableButton]o-[<abstract>Widget] - [SelectableButton]o-[dynamic Function()?] + [ContactItem]o-[IconData] + [ContactItem]o-[ContactItemType] + [ContactItem]o-[Color] - [BottomOnboardingNavigation + [ContactItemType | - +onBack: void Function()?; - +onNext: void Function()?; - +backLabel: String?; - +nextLabel: String?; - +hideNext: bool; - +nextIcon: Icon?; - +backIcon: Icon?; - +progress: Widget? + +index: int; + <static>+values: List<ContactItemType>; + <static>+website: ContactItemType; + <static>+email: ContactItemType; + <static>+phone: ContactItemType + ] + + [ContactItemType]o-[ContactItemType] + [Enum]<:--[ContactItemType] + + [LinearRegressionSectionWidget + | + +section: LinearRegressionSection | +Widget build() ] - [BottomOnboardingNavigation]o-[void Function()?] - [BottomOnboardingNavigation]o-[Icon] - [BottomOnboardingNavigation]o-[<abstract>Widget] + [LinearRegressionSectionWidget]o-[LinearRegressionSection] + [<abstract>ReportSectionWidget]<:-[LinearRegressionSectionWidget] - [AppAnalytics + [AverageSectionWidget | - <static>-_userEnabled: bool?; - <static>+keyAnalyticsUserEnable: String; - +context: BuildContext; - +subject: StudySubject?; - <static>+isUserEnabled: dynamic + +section: AverageSection; + +titlePos: List<int>; + +phasePos: List<int> | - <static>+dynamic init(); - <static>+dynamic start(); - <static>+void setEnabled(); - +dynamic initBasic(); - +void initAdvanced() + +Widget build(); + +Widget getDiagram(); + +BarChartData getChartData(); + +Widget getTitles(); + +Widget getValues(); + +List<BarChartGroupData> getBarGroups(); + +MaterialColor getColor(); + +Iterable<DiagramDatum> getAggregatedData() ] - [AppAnalytics]o-[<abstract>BuildContext] - [AppAnalytics]o-[StudySubject] + [AverageSectionWidget]o-[AverageSection] + [<abstract>ReportSectionWidget]<:-[AverageSectionWidget] - [StudyNotification + [DiagramDatum | - +taskInstance: TaskInstance; - +date: DateTime + +x: num; + +value: num; + +timestamp: DateTime?; + +intervention: String ] - [StudyNotification]o-[TaskInstance] - - [GroupedIterable + [ReportDetailsScreen | - +data: Map<K, Iterable<V>>; - +iterator: Iterator<MapEntry<K, Iterable<V>>> + +subject: StudySubject | - +Iterable<MapEntry<K, R>> aggregate(); - +Iterable<MapEntry<K, R>> aggregateWithKey() + <static>+MaterialPageRoute<dynamic> routeFor(); + +Widget build() ] - [Iterable]<:-[GroupedIterable] - - [NotificationValidators - | - +didNotificationLaunchApp: bool; - +wasNotificationActionHandled: bool; - +wasNotificationActionCompleted: bool - ] + [ReportDetailsScreen]o-[StudySubject] - [StudyNotifications + [<abstract>GenericSection | +subject: StudySubject?; - +flutterLocalNotificationsPlugin: FlutterLocalNotificationsPlugin; - +context: BuildContext; - +didReceiveLocalNotificationStream: StreamController<ReceivedNotification>; - +selectNotificationStream: StreamController<String?>; - <static>+validator: NotificationValidators; - <static>+debug: bool; - <static>+scheduledNotificationsDebug: String? + +onTap: void Function()? | - <static>+dynamic create(); - -dynamic _isAndroidPermissionGranted(); - -dynamic _requestPermissions(); - -void _configureDidReceiveLocalNotificationSubject(); - -void _configureSelectNotificationSubject(); - -void _initNotificationsPlugin(); - +dynamic handleNotificationResponse() + +Widget buildContent(); + +Widget build() ] - [StudyNotifications]o-[StudySubject] - [StudyNotifications]o-[FlutterLocalNotificationsPlugin] - [StudyNotifications]o-[<abstract>BuildContext] - [StudyNotifications]o-[StreamController] - [StudyNotifications]o-[NotificationValidators] + [<abstract>GenericSection]o-[StudySubject] + [<abstract>GenericSection]o-[void Function()?] - [ReceivedNotification + [GeneralDetailsSection | - +id: int?; - +title: String?; - +body: String?; - +payload: String? + +Widget buildContent() ] - [Cache + [<abstract>GenericSection]<:-[GeneralDetailsSection] + + [PerformanceSection | - <static>+isSynchronizing: bool; - <static>+sharedPrefs: dynamic + +minimumRatio: double; + +maximum: double | - <static>+dynamic storeSubject(); - <static>+dynamic loadSubject(); - <static>+dynamic storeAnalytics(); - <static>+dynamic loadAnalytics(); - <static>+dynamic delete(); - <static>+dynamic synchronize() + +Widget buildContent(); + +String getPowerLevelDescription(); + +int getCountableObservationAmount() ] - [Preview + [<abstract>GenericSection]<:-[PerformanceSection] + + [PerformanceBar | - +queryParameters: Map<String, String>?; - +appLanguage: AppLanguage; - +selectedRoute: String?; - +extra: String?; - +study: Study?; - +selectedStudyObjectId: String?; - +subject: StudySubject? + +progress: double; + +minimum: double? | - +bool hasRoute(); - +void handleQueries(); - +dynamic init(); - +dynamic handleAuthorization(); - +dynamic runCommands(); - +String? getSelectedRoute(); - +bool containsQuery(); - +bool containsQueryPair(); - +dynamic getStudySubject(); - -dynamic _createFakeSubject(); - +List<String> getInterventionIds() + +Widget build() ] - [Preview]o-[AppLanguage] - [Preview]o-[Study] - [Preview]o-[StudySubject] - - [WelcomeScreen + [PerformanceDetailsScreen + | + +reportSubject: StudySubject? | + <static>+MaterialPageRoute<dynamic> routeFor(); +Widget build() ] - [TermsScreen - ] + [PerformanceDetailsScreen]o-[StudySubject] - [LegalSection + [InterventionPerformanceBar | - +title: String?; - +description: String?; - +icon: Icon?; - +pdfUrl: String?; - +pdfUrlLabel: String?; - +acknowledgment: String?; - +isChecked: bool?; - +onChange: void Function(bool?)? + +intervention: Intervention; + +subject: StudySubject? | +Widget build() ] - [LegalSection]o-[Icon] - [LegalSection]o-[void Function(bool?)?] + [InterventionPerformanceBar]o-[Intervention] + [InterventionPerformanceBar]o-[StudySubject] - [IFrameHelper + [ObservationPerformanceBar | - +void postRouteFinished(); - +void listen() + +observation: Observation; + +subject: StudySubject? + | + +Widget build() ] - [AboutScreen + [ObservationPerformanceBar]o-[<abstract>Observation] + [ObservationPerformanceBar]o-[StudySubject] + + [PerformanceBar + | + +task: Task; + +completed: int; + +total: int | +Widget build() ] - [LoadingScreen + [PerformanceBar]o-[<abstract>Task] + + [ReportHistoryScreen | - +sessionString: String?; - +queryParameters: Map<String, String>? + +Widget build() ] - [DisclaimerSection + [ReportHistoryItem | - +Widget buildContent() + +subject: StudySubject + | + +Widget build() ] - [<abstract>GenericSection]<:-[DisclaimerSection] + [ReportHistoryItem]o-[StudySubject] - [ReportDetailsScreen + [<abstract>ReportSectionWidget | +subject: StudySubject - | - <static>+MaterialPageRoute<dynamic> routeFor(); - +Widget build() ] - [ReportDetailsScreen]o-[StudySubject] + [<abstract>ReportSectionWidget]o-[StudySubject] - [LinearRegressionSectionWidget + [ReportSectionContainer | - +section: LinearRegressionSection + <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)>; + +section: ReportSection; + +subject: StudySubject; + +primary: bool; + +onTap: void Function()? | + +ReportSectionWidget buildContents(); + +List<Widget> buildPrimaryHeader(); +Widget build() ] - [LinearRegressionSectionWidget]o-[LinearRegressionSection] - [<abstract>ReportSectionWidget]<:-[LinearRegressionSectionWidget] + [ReportSectionContainer]o-[<abstract>ReportSection] + [ReportSectionContainer]o-[StudySubject] + [ReportSectionContainer]o-[void Function()?] - [AverageSectionWidget - | - +section: AverageSection; - +titlePos: List<int>; - +phasePos: List<int> + [DisclaimerSection | - +Widget build(); - +Widget getDiagram(); - +BarChartData getChartData(); - +Widget getTitles(); - +Widget getValues(); - +List<BarChartGroupData> getBarGroups(); - +MaterialColor getColor(); - +Iterable<DiagramDatum> getAggregatedData() + +Widget buildContent() ] - [AverageSectionWidget]o-[AverageSection] - [<abstract>ReportSectionWidget]<:-[AverageSectionWidget] + [<abstract>GenericSection]<:-[DisclaimerSection] - [DiagramDatum + [CheckmarkTaskWidget | - +x: num; - +value: num; - +timestamp: DateTime?; - +intervention: String + +task: CheckmarkTask?; + +completionPeriod: CompletionPeriod? ] - [ReportHistoryScreen + [CheckmarkTaskWidget]o-[CheckmarkTask] + [CheckmarkTaskWidget]o-[CompletionPeriod] + + [TaskScreen | - +Widget build() + +taskInstance: TaskInstance + | + <static>+MaterialPageRoute<bool> routeFor() ] - [ReportHistoryItem - | - +subject: StudySubject + [TaskScreen]o-[TaskInstance] + + [QuestionnaireTaskWidget | - +Widget build() + +task: QuestionnaireTask; + +completionPeriod: CompletionPeriod ] - [ReportHistoryItem]o-[StudySubject] + [QuestionnaireTaskWidget]o-[QuestionnaireTask] + [QuestionnaireTaskWidget]o-[CompletionPeriod] - [<abstract>GenericSection + [KickoffScreen + ] + + [_KickoffScreen | +subject: StudySubject?; - +onTap: void Function()? + +ready: bool | - +Widget buildContent(); + -dynamic _storeUserStudy(); + -Widget _constructStatusIcon(); + -String _getStatusText(); +Widget build() ] - [<abstract>GenericSection]o-[StudySubject] - [<abstract>GenericSection]o-[void Function()?] + [_KickoffScreen]o-[StudySubject] - [GeneralDetailsSection + [EligibilityResult | - +Widget buildContent() + +eligible: bool; + +firstFailed: EligibilityCriterion? ] - [<abstract>GenericSection]<:-[GeneralDetailsSection] + [EligibilityResult]o-[EligibilityCriterion] - [<abstract>ReportSectionWidget + [EligibilityScreen | - +subject: StudySubject + +study: Study? + | + <static>+MaterialPageRoute<EligibilityResult> routeFor() ] - [<abstract>ReportSectionWidget]o-[StudySubject] + [EligibilityScreen]o-[Study] - [ReportSectionContainer - | - <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)>; - +section: ReportSection; - +subject: StudySubject; - +primary: bool; - +onTap: void Function()? - | - +ReportSectionWidget buildContents(); - +List<Widget> buildPrimaryHeader(); - +Widget build() + [JourneyOverviewScreen ] - [ReportSectionContainer]o-[<abstract>ReportSection] - [ReportSectionContainer]o-[StudySubject] - [ReportSectionContainer]o-[void Function()?] - - [PerformanceDetailsScreen + [_JourneyOverviewScreen | - +reportSubject: StudySubject? + +subject: StudySubject? | - <static>+MaterialPageRoute<dynamic> routeFor(); + +dynamic getConsentAndNavigateToDashboard(); +Widget build() ] - [PerformanceDetailsScreen]o-[StudySubject] + [_JourneyOverviewScreen]o-[StudySubject] - [InterventionPerformanceBar + [Timeline | - +intervention: Intervention; +subject: StudySubject? | +Widget build() ] - [InterventionPerformanceBar]o-[Intervention] - [InterventionPerformanceBar]o-[StudySubject] + [Timeline]o-[StudySubject] - [ObservationPerformanceBar + [InterventionTile | - +observation: Observation; - +subject: StudySubject? + +title: String?; + +iconName: String; + +date: DateTime; + +color: Color?; + +isFirst: bool; + +isLast: bool | +Widget build() ] - [ObservationPerformanceBar]o-[<abstract>Observation] - [ObservationPerformanceBar]o-[StudySubject] + [InterventionTile]o-[Color] - [PerformanceBar + [IconIndicator | - +task: Task; - +completed: int; - +total: int + +iconName: String; + +color: Color? | +Widget build() ] - [PerformanceBar]o-[<abstract>Task] + [IconIndicator]o-[Color] - [PerformanceSection + [TimelineChild | - +minimumRatio: double; - +maximum: double + +child: Widget? | - +Widget buildContent(); - +String getPowerLevelDescription(); - +int getCountableObservationAmount() + +Widget build() ] - [<abstract>GenericSection]<:-[PerformanceSection] + [TimelineChild]o-[<abstract>Widget] - [PerformanceBar + [OnboardingProgress | - +progress: double; - +minimum: double? + +stage: int; + +progress: double | + -double _getProgressForStage(); +Widget build() ] - [TaskScreen + [ConsentScreen + ] + + [ConsentCard | - +taskInstance: TaskInstance + +consent: ConsentItem?; + +index: int?; + +onTapped: dynamic Function(int); + +isChecked: bool? | - <static>+MaterialPageRoute<bool> routeFor() + +Widget build() ] - [TaskScreen]o-[TaskInstance] + [ConsentCard]o-[ConsentItem] + [ConsentCard]o-[dynamic Function(int)] - [QuestionnaireTaskWidget + [ConsentElement | - +task: QuestionnaireTask; - +completionPeriod: CompletionPeriod + +title: String; + +descriptionText: String; + +acknowledgmentText: String; + +icon: IconData ] - [QuestionnaireTaskWidget]o-[QuestionnaireTask] - [QuestionnaireTaskWidget]o-[CompletionPeriod] + [ConsentElement]o-[IconData] - [CheckmarkTaskWidget - | - +task: CheckmarkTask?; - +completionPeriod: CompletionPeriod? + [InterventionSelectionScreen ] - [CheckmarkTaskWidget]o-[CheckmarkTask] - [CheckmarkTaskWidget]o-[CompletionPeriod] - [StudyOverviewScreen ] @@ -661,3402 +588,3474 @@ [InviteCodeDialog ] - [InterventionSelectionScreen - ] - - [KickoffScreen + [Routes + | + <static>+loading: String; + <static>+preview: String; + <static>+dashboard: String; + <static>+welcome: String; + <static>+about: String; + <static>+terms: String; + <static>+studySelection: String; + <static>+studyOverview: String; + <static>+interventionSelection: String; + <static>+journey: String; + <static>+consent: String; + <static>+kickoff: String; + <static>+contact: String; + <static>+faq: String; + <static>+appSettings: String; + <static>+questionnaire: String; + <static>+reportHistory: String; + <static>+reportDetails: String; + <static>+performanceDetails: String + | + <static>+Route<dynamic> unknownRoute(); + <static>+Route<dynamic>? generateRoute() ] - [_KickoffScreen + [GroupedIterable | - +subject: StudySubject?; - +ready: bool + +data: Map<K, Iterable<V>>; + +iterator: Iterator<MapEntry<K, Iterable<V>>> | - -dynamic _storeUserStudy(); - -Widget _constructStatusIcon(); - -String _getStatusText(); - +Widget build() + +Iterable<MapEntry<K, R>> aggregate(); + +Iterable<MapEntry<K, R>> aggregateWithKey() ] - [_KickoffScreen]o-[StudySubject] + [Iterable]<:-[GroupedIterable] - [JourneyOverviewScreen + [Cache + | + <static>+isSynchronizing: bool; + <static>+sharedPrefs: dynamic + | + <static>+dynamic storeSubject(); + <static>+dynamic loadSubject(); + <static>+dynamic storeAnalytics(); + <static>+dynamic loadAnalytics(); + <static>+dynamic delete(); + <static>+dynamic synchronize() ] - [_JourneyOverviewScreen - | - +subject: StudySubject? + [StudyNotification | - +dynamic getConsentAndNavigateToDashboard(); - +Widget build() + +taskInstance: TaskInstance; + +date: DateTime ] - [_JourneyOverviewScreen]o-[StudySubject] + [StudyNotification]o-[TaskInstance] - [Timeline + [NotificationValidators | - +subject: StudySubject? + +didNotificationLaunchApp: bool; + +wasNotificationActionHandled: bool; + +wasNotificationActionCompleted: bool + ] + + [StudyNotifications | - +Widget build() + +subject: StudySubject?; + +flutterLocalNotificationsPlugin: FlutterLocalNotificationsPlugin; + +context: BuildContext; + +didReceiveLocalNotificationStream: StreamController<ReceivedNotification>; + +selectNotificationStream: StreamController<String?>; + <static>+validator: NotificationValidators; + <static>+debug: bool; + <static>+scheduledNotificationsDebug: String? + | + <static>+dynamic create(); + -dynamic _isAndroidPermissionGranted(); + -dynamic _requestPermissions(); + -void _configureDidReceiveLocalNotificationSubject(); + -void _configureSelectNotificationSubject(); + -void _initNotificationsPlugin(); + +dynamic handleNotificationResponse() ] - [Timeline]o-[StudySubject] + [StudyNotifications]o-[StudySubject] + [StudyNotifications]o-[FlutterLocalNotificationsPlugin] + [StudyNotifications]o-[<abstract>BuildContext] + [StudyNotifications]o-[StreamController] + [StudyNotifications]o-[NotificationValidators] - [InterventionTile + [ReceivedNotification | + +id: int?; +title: String?; - +iconName: String; - +date: DateTime; - +color: Color?; - +isFirst: bool; - +isLast: bool + +body: String?; + +payload: String? + ] + + [AppAnalytics + | + <static>-_userEnabled: bool?; + <static>+keyAnalyticsUserEnable: String; + +context: BuildContext; + +subject: StudySubject?; + <static>+isUserEnabled: dynamic | - +Widget build() + <static>+dynamic init(); + <static>+dynamic start(); + <static>+void setEnabled(); + +dynamic initBasic(); + +void initAdvanced() ] - [InterventionTile]o-[Color] + [AppAnalytics]o-[<abstract>BuildContext] + [AppAnalytics]o-[StudySubject] - [IconIndicator + [HtmlText | - +iconName: String; - +color: Color? + +text: String?; + +style: TextStyle? | +Widget build() ] - [IconIndicator]o-[Color] + [HtmlText]o-[TextStyle] - [TimelineChild - | - +child: Widget? + [ChoiceQuestionWidget | - +Widget build() + +question: ChoiceQuestion; + +onDone: dynamic Function(Answer<dynamic>); + +multiSelectionText: String; + +subtitle: String? ] - [TimelineChild]o-[<abstract>Widget] + [ChoiceQuestionWidget]o-[ChoiceQuestion] + [ChoiceQuestionWidget]o-[dynamic Function(Answer<dynamic>)] + [<abstract>QuestionWidget]<:-[ChoiceQuestionWidget] - [ConsentScreen + [AnnotatedScaleQuestionWidget + | + +question: AnnotatedScaleQuestion; + +onDone: dynamic Function(Answer<dynamic>)? ] - [ConsentCard - | - +consent: ConsentItem?; - +index: int?; - +onTapped: dynamic Function(int); - +isChecked: bool? + [AnnotatedScaleQuestionWidget]o-[AnnotatedScaleQuestion] + [AnnotatedScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] + [<abstract>QuestionWidget]<:-[AnnotatedScaleQuestionWidget] + + [<abstract>QuestionWidget | - +Widget build() + +subtitle: String? ] - [ConsentCard]o-[ConsentItem] - [ConsentCard]o-[dynamic Function(int)] - - [ConsentElement + [ScaleQuestionWidget | - +title: String; - +descriptionText: String; - +acknowledgmentText: String; - +icon: IconData + +question: ScaleQuestion; + +onDone: dynamic Function(Answer<dynamic>)? ] - [ConsentElement]o-[IconData] + [ScaleQuestionWidget]o-[ScaleQuestion] + [ScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] + [<abstract>QuestionWidget]<:-[ScaleQuestionWidget] - [EligibilityResult + [VisualAnalogueQuestionWidget | - +eligible: bool; - +firstFailed: EligibilityCriterion? + +question: VisualAnalogueQuestion; + +onDone: dynamic Function(Answer<dynamic>)? ] - [EligibilityResult]o-[EligibilityCriterion] + [VisualAnalogueQuestionWidget]o-[VisualAnalogueQuestion] + [VisualAnalogueQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] + [<abstract>QuestionWidget]<:-[VisualAnalogueQuestionWidget] - [EligibilityScreen - | - +study: Study? + [QuestionnaireWidget | - <static>+MaterialPageRoute<EligibilityResult> routeFor() + +title: String?; + +header: String?; + +footer: String?; + +questions: List<Question<dynamic>> ] - [EligibilityScreen]o-[Study] - - [OnboardingProgress + [HtmlTextBox | - +stage: int; - +progress: double + +text: String? | - -double _getProgressForStage(); +Widget build() ] - [TaskOverview + [BooleanQuestionWidget | - +subject: StudySubject?; - +scheduleToday: List<TaskInstance>?; - +interventionIcon: String? + +question: BooleanQuestion; + +onDone: dynamic Function(Answer<dynamic>)? ] - [TaskOverview]o-[StudySubject] + [BooleanQuestionWidget]o-[BooleanQuestion] + [BooleanQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] + [<abstract>QuestionWidget]<:-[BooleanQuestionWidget] - [ProgressRow + [QuestionContainer | - +subject: StudySubject? + +onDone: dynamic Function(Answer<dynamic>, int); + +question: Question<dynamic>; + +index: int ] - [ProgressRow]o-[StudySubject] + [QuestionContainer]o-[dynamic Function(Answer<dynamic>, int)] + [QuestionContainer]o-[<abstract>Question] - [InterventionSegment + [QuestionHeader | - +intervention: Intervention; - +percentCompleted: double; - +percentMissed: double; - +isCurrent: bool; - +isFuture: bool; - +phaseDuration: int + +prompt: String?; + +subtitle: String?; + +rationale: String? | - +List<Widget> buildSeparators(); + -List<Widget> _buildSubtitle(); + -List<Widget> _buildRationaleButton(); +Widget build() ] - [InterventionSegment]o-[Intervention] - - [TaskBox + [CustomSlider | - +taskInstance: TaskInstance; - +icon: Icon; - +onCompleted: dynamic Function() + +value: double?; + +minValue: double?; + +maxValue: double?; + +minorTick: int?; + +onChanged: dynamic Function(double)?; + +onChangeEnd: dynamic Function(double)?; + +activeColor: Color?; + +inactiveColor: Color?; + +minColor: Color?; + +maxColor: Color?; + +thumbColor: Color?; + +isColored: bool; + +labelValuePrecision: int; + +tickValuePrecision: int; + +linearStep: bool; + +steps: AnnotatedScaleQuestion? + | + +Widget build() ] - [TaskBox]o-[TaskInstance] - [TaskBox]o-[Icon] - [TaskBox]o-[dynamic Function()] + [CustomSlider]o-[dynamic Function(double)?] + [CustomSlider]o-[Color] + [CustomSlider]o-[AnnotatedScaleQuestion] - [Settings + [CustomTrackShape + | + +Rect getPreferredRect() ] - [OptOutAlertDialog + [RoundedRectSliderTrackShape]<:-[CustomTrackShape] + + [StudyTile | - +subject: StudySubject? + +title: String?; + +description: String?; + +iconName: String; + +onTap: dynamic Function()?; + +contentPadding: EdgeInsetsGeometry | +Widget build() ] - [OptOutAlertDialog]o-[StudySubject] + [StudyTile]o-[dynamic Function()?] + [StudyTile]o-[<abstract>EdgeInsetsGeometry] - [DeleteAlertDialog + [SelectableButton | - +subject: StudySubject? + +child: Widget; + +selected: bool; + +onTap: dynamic Function()? | + -Color _getFillColor(); + -Color _getTextColor(); +Widget build() ] - [DeleteAlertDialog]o-[StudySubject] - - [ContactScreen - ] + [SelectableButton]o-[<abstract>Widget] + [SelectableButton]o-[dynamic Function()?] - [ContactWidget + [RoundCheckbox | - +contact: Contact?; - +title: String; - +subtitle: String?; - +color: Color + +onChanged: dynamic Function(bool)?; + +value: bool? | +Widget build() ] - [ContactWidget]o-[Contact] - [ContactWidget]o-[Color] + [RoundCheckbox]o-[dynamic Function(bool)?] - [ContactItem + [InterventionCard | - +iconData: IconData; - +itemName: String; - +itemValue: String?; - +type: ContactItemType?; - +iconColor: Color? + +intervention: Intervention; + +selected: bool; + +showCheckbox: bool; + +showTasks: bool; + +showDescription: bool; + +onTap: dynamic Function()? | - +dynamic launchContact(); +Widget build() ] - [ContactItem]o-[IconData] - [ContactItem]o-[ContactItemType] - [ContactItem]o-[Color] + [InterventionCard]o-[Intervention] + [InterventionCard]o-[dynamic Function()?] - [ContactItemType + [InterventionCardTitle | - +index: int; - <static>+values: List<ContactItemType>; - <static>+website: ContactItemType; - <static>+email: ContactItemType; - <static>+phone: ContactItemType - ] - - [ContactItemType]o-[ContactItemType] - [Enum]<:--[ContactItemType] - - [FAQ + +intervention: Intervention?; + +selected: bool; + +showCheckbox: bool; + +showDescriptionButton: bool; + +onTap: dynamic Function()? | +Widget build() ] - [Entry - | - +title: String; - +children: List<Entry> - ] + [InterventionCardTitle]o-[Intervention] + [InterventionCardTitle]o-[dynamic Function()?] - [EntryItem + [InterventionCardDescription | - +entry: Entry + +intervention: Intervention | - -Widget _buildTiles(); +Widget build() ] - [EntryItem]o-[Entry] + [InterventionCardDescription]o-[Intervention] - [DashboardScreen + [_TaskList | - +error: String? - ] - - [OverflowMenuItem + +tasks: List<InterventionTask> | - +name: String; - +icon: IconData; - +routeName: String?; - +onTap: dynamic Function()? + +String scheduleString(); + +Widget build() ] - [OverflowMenuItem]o-[IconData] - [OverflowMenuItem]o-[dynamic Function()?] - - [StudyFinishedPlaceholder + [BottomOnboardingNavigation | - <static>+space: SizedBox + +onBack: void Function()?; + +onNext: void Function()?; + +backLabel: String?; + +nextLabel: String?; + +hideNext: bool; + +nextIcon: Icon?; + +backIcon: Icon?; + +progress: Widget? | +Widget build() ] - [StudyFinishedPlaceholder]o-[SizedBox] + [BottomOnboardingNavigation]o-[void Function()?] + [BottomOnboardingNavigation]o-[Icon] + [BottomOnboardingNavigation]o-[<abstract>Widget] - [MyApp + [ThemeConfig | - +queryParameters: Map<String, String>; - +appConfig: AppConfig? + <static>+SliderThemeData coloredSliderTheme() ] - [MyApp]o-[AppConfig] - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - - - + - + - + - + - - - + - + - + - + - - - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - - - + + - + + - + - + + + - + - + + + - + - + - + - + - + - + + + + + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - - - + - + - + - + - - - + - + - - - + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + + + - + - + - + - + + + - + - + - + - + + + - + - + - + - + + + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + + - - + - + - + - + - + - + - + - + - + - + - - - - + + + + - - - ThemeConfig + + + MyApp - - - <static>+SliderThemeData coloredSliderTheme() + + + +queryParameters: Map<String, String> + +appConfig: AppConfig? - - - - - - - - - Routes - - - - - - <static>+loading: String - <static>+preview: String - <static>+dashboard: String - <static>+welcome: String - <static>+about: String - <static>+terms: String - <static>+studySelection: String - <static>+studyOverview: String - <static>+interventionSelection: String - <static>+journey: String - <static>+consent: String - <static>+kickoff: String - <static>+contact: String - <static>+faq: String - <static>+appSettings: String - <static>+questionnaire: String - <static>+reportHistory: String - <static>+reportDetails: String - <static>+performanceDetails: String - - + + + - - - <static>+Route<dynamic> unknownRoute() - <static>+Route<dynamic>? generateRoute() + + + AppConfig - - - - - - - - - InterventionCard - - + + + + - - - +intervention: Intervention - +selected: bool - +showCheckbox: bool - +showTasks: bool - +showDescription: bool - +onTap: dynamic Function()? + + + AboutScreen - - - +Widget build() + + + +Widget build() - - - + + + + + - - - Intervention + + + Preview - - - - - - - - dynamic Function()? + + + +queryParameters: Map<String, String>? + +appLanguage: AppLanguage + +selectedRoute: String? + +extra: String? + +study: Study? + +selectedStudyObjectId: String? + +subject: StudySubject? - - - - - - - - - - InterventionCardTitle + + + +bool hasRoute() + +void handleQueries() + +dynamic init() + +dynamic handleAuthorization() + +dynamic runCommands() + +String? getSelectedRoute() + +bool containsQuery() + +bool containsQueryPair() + +dynamic getStudySubject() + -dynamic _createFakeSubject() + +List<String> getInterventionIds() - - - +intervention: Intervention? - +selected: bool - +showCheckbox: bool - +showDescriptionButton: bool - +onTap: dynamic Function()? - - + + + + - - - +Widget build() + + + AppLanguage - - - - - + + + - - - InterventionCardDescription + + + Study - - - +intervention: Intervention - - + + + + - - - +Widget build() + + + StudySubject - - - - - - - - - _TaskList - - + + + + - - - +tasks: List<InterventionTask> + + + IFrameHelper - - - +String scheduleString() - +Widget build() + + + +void postRouteFinished() + +void listen() - - - - - - - - - RoundCheckbox - - - - - - +onChanged: dynamic Function(bool)? - +value: bool? - - + + + - - - +Widget build() + + + TermsScreen - - - + + + + + - - - dynamic Function(bool)? + + + LegalSection - - - - - - - - - VisualAnalogueQuestionWidget + + + +title: String? + +description: String? + +icon: Icon? + +pdfUrl: String? + +pdfUrlLabel: String? + +acknowledgment: String? + +isChecked: bool? + +onChange: void Function(bool?)? - - - +question: VisualAnalogueQuestion - +onDone: dynamic Function(Answer<dynamic>)? + + + +Widget build() - - - + + + - - - VisualAnalogueQuestion + + + Icon - - - + + + - - - dynamic Function(Answer<dynamic>)? + + + void Function(bool?)? - - - - + + + + - - - QuestionWidget + + + LoadingScreen - - - +subtitle: String? + + + +sessionString: String? + +queryParameters: Map<String, String>? - - - - - - - - - QuestionHeader - - + + + + - - - +prompt: String? - +subtitle: String? - +rationale: String? + + + WelcomeScreen - - - -List<Widget> _buildSubtitle() - -List<Widget> _buildRationaleButton() - +Widget build() + + + +Widget build() - - - - + + + + - - - QuestionnaireWidget + + + DashboardScreen - - - +title: String? - +header: String? - +footer: String? - +questions: List<Question<dynamic>> + + + +error: String? - - - - - - - - - HtmlTextBox - - + + + + - - - +text: String? + + + OverflowMenuItem - - - +Widget build() + + + +name: String + +icon: IconData + +routeName: String? + +onTap: dynamic Function()? - - - - + + + - - - AnnotatedScaleQuestionWidget + + + IconData - - - +question: AnnotatedScaleQuestion - +onDone: dynamic Function(Answer<dynamic>)? + + + + + + + + dynamic Function()? - - - + + + + + - - - AnnotatedScaleQuestion + + + StudyFinishedPlaceholder - - - - - - - - - BooleanQuestionWidget + + + <static>+space: SizedBox - - - +question: BooleanQuestion - +onDone: dynamic Function(Answer<dynamic>)? + + + +Widget build() - - - + + + - - - BooleanQuestion + + + SizedBox - - - - + + + + - - - ChoiceQuestionWidget + + + TaskBox - - - +question: ChoiceQuestion - +onDone: dynamic Function(Answer<dynamic>) - +multiSelectionText: String - +subtitle: String? + + + +taskInstance: TaskInstance + +icon: Icon + +onCompleted: dynamic Function() - - - + + + - - - ChoiceQuestion + + + TaskInstance - - - + + + - - - dynamic Function(Answer<dynamic>) + + + dynamic Function() - - - - + + + + - - - ScaleQuestionWidget + + + ProgressRow - - - +question: ScaleQuestion - +onDone: dynamic Function(Answer<dynamic>)? + + + +subject: StudySubject? - - - + + + + + - - - ScaleQuestion + + + InterventionSegment - - - - - + + + +intervention: Intervention + +percentCompleted: double + +percentMissed: double + +isCurrent: bool + +isFuture: bool + +phaseDuration: int + + - - - QuestionContainer + + + +List<Widget> buildSeparators() + +Widget build() - - - +onDone: dynamic Function(Answer<dynamic>, int) - +question: Question<dynamic> - +index: int + + + + + + + + Intervention - - - + + + + - - - dynamic Function(Answer<dynamic>, int) + + + TaskOverview + + + + + + +subject: StudySubject? + +scheduleToday: List<TaskInstance>? + +interventionIcon: String? - - - + + + - - - Question + + + Settings - - - - - + + + + + - - - CustomSlider + + + OptOutAlertDialog - - - +value: double? - +minValue: double? - +maxValue: double? - +minorTick: int? - +onChanged: dynamic Function(double)? - +onChangeEnd: dynamic Function(double)? - +activeColor: Color? - +inactiveColor: Color? - +minColor: Color? - +maxColor: Color? - +thumbColor: Color? - +isColored: bool - +labelValuePrecision: int - +tickValuePrecision: int - +linearStep: bool - +steps: AnnotatedScaleQuestion? + + + +subject: StudySubject? - - - +Widget build() + + + +Widget build() - - - + + + + + - - - dynamic Function(double)? + + + DeleteAlertDialog - - - - + + + +subject: StudySubject? + + - - - Color + + + +Widget build() - - - - + + + + - - - CustomTrackShape + + + FAQ - - - +Rect getPreferredRect() + + + +Widget build() - - - + + + + - - - RoundedRectSliderTrackShape + + + Entry + + + + + + +title: String + +children: List<Entry> - - - - - + + + + + - - - HtmlText + + + EntryItem - - - +text: String? - +style: TextStyle? + + + +entry: Entry - - - +Widget build() + + + -Widget _buildTiles() + +Widget build() - - - + + + - - - TextStyle + + + ContactScreen - - - - - + + + + + - - - StudyTile + + + ContactWidget - - - +title: String? - +description: String? - +iconName: String - +onTap: dynamic Function()? - +contentPadding: EdgeInsetsGeometry + + + +contact: Contact? + +title: String + +subtitle: String? + +color: Color - - - +Widget build() + + + +Widget build() - - - + + + - - - EdgeInsetsGeometry + + + Contact - - - - - + + + - - - SelectableButton + + + Color - - - +child: Widget - +selected: bool - +onTap: dynamic Function()? + + + + + + + + + + ContactItem - - - -Color _getFillColor() - -Color _getTextColor() - +Widget build() + + + +iconData: IconData + +itemName: String + +itemValue: String? + +type: ContactItemType? + +iconColor: Color? + + + + + + +dynamic launchContact() + +Widget build() - - - + + + + - - - Widget + + + ContactItemType + + + + + + +index: int + <static>+values: List<ContactItemType> + <static>+website: ContactItemType + <static>+email: ContactItemType + <static>+phone: ContactItemType - - - - - + + + - - - BottomOnboardingNavigation + + + Enum - - - +onBack: void Function()? - +onNext: void Function()? - +backLabel: String? - +nextLabel: String? - +hideNext: bool - +nextIcon: Icon? - +backIcon: Icon? - +progress: Widget? + + + + + + + + + + LinearRegressionSectionWidget - - - +Widget build() + + + +section: LinearRegressionSection + + + + + + +Widget build() - - - + + + - - - void Function()? + + + LinearRegressionSection - - - + + + + - - - Icon + + + ReportSectionWidget + + + + + + +subject: StudySubject - - - - - + + + + + - - - AppAnalytics + + + AverageSectionWidget - - - <static>-_userEnabled: bool? - <static>+keyAnalyticsUserEnable: String - +context: BuildContext - +subject: StudySubject? - <static>+isUserEnabled: dynamic + + + +section: AverageSection + +titlePos: List<int> + +phasePos: List<int> - - - <static>+dynamic init() - <static>+dynamic start() - <static>+void setEnabled() - +dynamic initBasic() - +void initAdvanced() + + + +Widget build() + +Widget getDiagram() + +BarChartData getChartData() + +Widget getTitles() + +Widget getValues() + +List<BarChartGroupData> getBarGroups() + +MaterialColor getColor() + +Iterable<DiagramDatum> getAggregatedData() - - - + + + - - - BuildContext + + + AverageSection - - - + + + + + + + + DiagramDatum + + - - - StudySubject + + + +x: num + +value: num + +timestamp: DateTime? + +intervention: String - - - - + + + + + - - - StudyNotification + + + ReportDetailsScreen - - - +taskInstance: TaskInstance - +date: DateTime + + + +subject: StudySubject - - - - - - - - TaskInstance + + + <static>+MaterialPageRoute<dynamic> routeFor() + +Widget build() - - - - - + + + + + - - - GroupedIterable + + + GenericSection - - - +data: Map<K, Iterable<V>> - +iterator: Iterator<MapEntry<K, Iterable<V>>> + + + +subject: StudySubject? + +onTap: void Function()? - - - +Iterable<MapEntry<K, R>> aggregate() - +Iterable<MapEntry<K, R>> aggregateWithKey() + + + +Widget buildContent() + +Widget build() - - - + + + - - - Iterable + + + void Function()? - - - - + + + + - - - NotificationValidators + + + GeneralDetailsSection - - - +didNotificationLaunchApp: bool - +wasNotificationActionHandled: bool - +wasNotificationActionCompleted: bool + + + +Widget buildContent() - - - - - + + + + + - - - StudyNotifications + + + PerformanceSection - - - +subject: StudySubject? - +flutterLocalNotificationsPlugin: FlutterLocalNotificationsPlugin - +context: BuildContext - +didReceiveLocalNotificationStream: StreamController<ReceivedNotification> - +selectNotificationStream: StreamController<String?> - <static>+validator: NotificationValidators - <static>+debug: bool - <static>+scheduledNotificationsDebug: String? + + + +minimumRatio: double + +maximum: double - - - <static>+dynamic create() - -dynamic _isAndroidPermissionGranted() - -dynamic _requestPermissions() - -void _configureDidReceiveLocalNotificationSubject() - -void _configureSelectNotificationSubject() - -void _initNotificationsPlugin() - +dynamic handleNotificationResponse() + + + +Widget buildContent() + +String getPowerLevelDescription() + +int getCountableObservationAmount() - - - + + + + + - - - FlutterLocalNotificationsPlugin + + + PerformanceBar - - - - + + + +progress: double + +minimum: double? + + - - - StreamController + + + +Widget build() - - - - + + + + + - - - ReceivedNotification + + + PerformanceDetailsScreen - - - +id: int? - +title: String? - +body: String? - +payload: String? + + + +reportSubject: StudySubject? + + + + + + <static>+MaterialPageRoute<dynamic> routeFor() + +Widget build() - - - - - + + + + + - - - Cache + + + InterventionPerformanceBar - - - <static>+isSynchronizing: bool - <static>+sharedPrefs: dynamic + + + +intervention: Intervention + +subject: StudySubject? - - - <static>+dynamic storeSubject() - <static>+dynamic loadSubject() - <static>+dynamic storeAnalytics() - <static>+dynamic loadAnalytics() - <static>+dynamic delete() - <static>+dynamic synchronize() + + + +Widget build() - - - - - + + + + + - - - Preview + + + ObservationPerformanceBar - - - +queryParameters: Map<String, String>? - +appLanguage: AppLanguage - +selectedRoute: String? - +extra: String? - +study: Study? - +selectedStudyObjectId: String? - +subject: StudySubject? + + + +observation: Observation + +subject: StudySubject? - - - +bool hasRoute() - +void handleQueries() - +dynamic init() - +dynamic handleAuthorization() - +dynamic runCommands() - +String? getSelectedRoute() - +bool containsQuery() - +bool containsQueryPair() - +dynamic getStudySubject() - -dynamic _createFakeSubject() - +List<String> getInterventionIds() + + + +Widget build() - - - + + + - - - AppLanguage + + + Observation - - - + + + - - - Study + + + Task - - - - + + + + - - - WelcomeScreen + + + ReportHistoryScreen - - - +Widget build() + + + +Widget build() - - - + + + + + - - - TermsScreen + + + ReportHistoryItem - - - - - - + + + +subject: StudySubject + + - - - LegalSection + + + +Widget build() - - - +title: String? - +description: String? - +icon: Icon? - +pdfUrl: String? - +pdfUrlLabel: String? - +acknowledgment: String? - +isChecked: bool? - +onChange: void Function(bool?)? + + + + + + + + + + ReportSectionContainer - - - +Widget build() + + + <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)> + +section: ReportSection + +subject: StudySubject + +primary: bool + +onTap: void Function()? + + + + + + +ReportSectionWidget buildContents() + +List<Widget> buildPrimaryHeader() + +Widget build() - - - + + + - - - void Function(bool?)? + + + ReportSection - - - - + + + + - - - IFrameHelper + + + DisclaimerSection - - - +void postRouteFinished() - +void listen() + + + +Widget buildContent() - - - - + + + + - - - AboutScreen + + + CheckmarkTaskWidget - - - +Widget build() + + + +task: CheckmarkTask? + +completionPeriod: CompletionPeriod? - - - - + + + - - - LoadingScreen + + + CheckmarkTask - - - +sessionString: String? - +queryParameters: Map<String, String>? + + + + + + + + CompletionPeriod - - - - + + + + + - - - DisclaimerSection + + + TaskScreen - - - +Widget buildContent() + + + +taskInstance: TaskInstance - - - - - - - - - - GenericSection + + + <static>+MaterialPageRoute<bool> routeFor() - - - +subject: StudySubject? - +onTap: void Function()? + + + + + + + + + QuestionnaireTaskWidget - - - +Widget buildContent() - +Widget build() + + + +task: QuestionnaireTask + +completionPeriod: CompletionPeriod - - - - - + + + - - - ReportDetailsScreen + + + QuestionnaireTask - - - +subject: StudySubject - - + + + + - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() + + + KickoffScreen - - - - - + + + + + - - - LinearRegressionSectionWidget + + + _KickoffScreen - - - +section: LinearRegressionSection + + + +subject: StudySubject? + +ready: bool - - - +Widget build() + + + -dynamic _storeUserStudy() + -Widget _constructStatusIcon() + -String _getStatusText() + +Widget build() - - - + + + + - - - LinearRegressionSection + + + EligibilityResult - - - - - - - - - ReportSectionWidget + + + +eligible: bool + +firstFailed: EligibilityCriterion? - - - +subject: StudySubject + + + + + + + + EligibilityCriterion - - - - - + + + + + - - - AverageSectionWidget + + + EligibilityScreen - - - +section: AverageSection - +titlePos: List<int> - +phasePos: List<int> + + + +study: Study? - - - +Widget build() - +Widget getDiagram() - +BarChartData getChartData() - +Widget getTitles() - +Widget getValues() - +List<BarChartGroupData> getBarGroups() - +MaterialColor getColor() - +Iterable<DiagramDatum> getAggregatedData() + + + <static>+MaterialPageRoute<EligibilityResult> routeFor() - - - + + + - - - AverageSection + + + JourneyOverviewScreen - - - - + + + + + - - - DiagramDatum + + + _JourneyOverviewScreen - - - +x: num - +value: num - +timestamp: DateTime? - +intervention: String + + + +subject: StudySubject? + + + + + + +dynamic getConsentAndNavigateToDashboard() + +Widget build() - - - - + + + + + - - - ReportHistoryScreen + + + Timeline - - - +Widget build() + + + +subject: StudySubject? + + + + + + +Widget build() - - - - - + + + + + - - - ReportHistoryItem + + + InterventionTile - - - +subject: StudySubject + + + +title: String? + +iconName: String + +date: DateTime + +color: Color? + +isFirst: bool + +isLast: bool - - - +Widget build() + + + +Widget build() - - - - + + + + + - - - GeneralDetailsSection + + + IconIndicator - - - +Widget buildContent() + + + +iconName: String + +color: Color? + + + + + + +Widget build() - - - - - + + + + + - - - ReportSectionContainer + + + TimelineChild - - - <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)> - +section: ReportSection - +subject: StudySubject - +primary: bool - +onTap: void Function()? + + + +child: Widget? - - - +ReportSectionWidget buildContents() - +List<Widget> buildPrimaryHeader() - +Widget build() + + + +Widget build() - - - + + + - - - ReportSection + + + Widget - - - - - + + + + + - - - PerformanceDetailsScreen + + + OnboardingProgress - - - +reportSubject: StudySubject? + + + +stage: int + +progress: double - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() + + + -double _getProgressForStage() + +Widget build() - - - - - + + + - - - InterventionPerformanceBar + + + ConsentScreen - - - +intervention: Intervention - +subject: StudySubject? - - + + + + + + - - - +Widget build() + + + ConsentCard - - - - - - - - - - ObservationPerformanceBar + + + +consent: ConsentItem? + +index: int? + +onTapped: dynamic Function(int) + +isChecked: bool? - - - +observation: Observation - +subject: StudySubject? + + + +Widget build() - - - +Widget build() + + + + + + + + ConsentItem - - - + + + - - - Observation + + + dynamic Function(int) - - - - - + + + + - - - PerformanceBar + + + ConsentElement - - - +task: Task - +completed: int - +total: int + + + +title: String + +descriptionText: String + +acknowledgmentText: String + +icon: IconData - - - +Widget build() + + + + + + + + InterventionSelectionScreen - - - + + + - - - Task + + + StudyOverviewScreen - - - - - + + + + + - - - PerformanceSection + + + _StudyOverviewScreen - - - +minimumRatio: double - +maximum: double + + + +study: Study? - - - +Widget buildContent() - +String getPowerLevelDescription() - +int getCountableObservationAmount() + + + +dynamic navigateToJourney() + +dynamic navigateToEligibilityCheck() + +Widget build() - - - - - + + + + + - - - TaskScreen + + + StudyDetailsView - - - +taskInstance: TaskInstance + + + +study: Study? + +iconSize: double - - - <static>+MaterialPageRoute<bool> routeFor() + + + +Widget build() - - - - - - - - QuestionnaireTaskWidget - - + + + + - - - +task: QuestionnaireTask - +completionPeriod: CompletionPeriod + + + StudySelectionScreen - - - - - - - - QuestionnaireTask + + + +Widget build() - - - + + + - - - CompletionPeriod + + + InviteCodeDialog - - - - + + + + + - - - CheckmarkTaskWidget + + + Routes - - - +task: CheckmarkTask? - +completionPeriod: CompletionPeriod? + + + <static>+loading: String + <static>+preview: String + <static>+dashboard: String + <static>+welcome: String + <static>+about: String + <static>+terms: String + <static>+studySelection: String + <static>+studyOverview: String + <static>+interventionSelection: String + <static>+journey: String + <static>+consent: String + <static>+kickoff: String + <static>+contact: String + <static>+faq: String + <static>+appSettings: String + <static>+questionnaire: String + <static>+reportHistory: String + <static>+reportDetails: String + <static>+performanceDetails: String - - - - - - - - CheckmarkTask + + + <static>+Route<dynamic> unknownRoute() + <static>+Route<dynamic>? generateRoute() - - - + + + + + - - - StudyOverviewScreen + + + GroupedIterable - - - - - - - - - - _StudyOverviewScreen + + + +data: Map<K, Iterable<V>> + +iterator: Iterator<MapEntry<K, Iterable<V>>> - - - +study: Study? + + + +Iterable<MapEntry<K, R>> aggregate() + +Iterable<MapEntry<K, R>> aggregateWithKey() - - - +dynamic navigateToJourney() - +dynamic navigateToEligibilityCheck() - +Widget build() + + + + + + + + Iterable - - - - - + + + + + - - - StudyDetailsView + + + Cache - - - +study: Study? - +iconSize: double + + + <static>+isSynchronizing: bool + <static>+sharedPrefs: dynamic - - - +Widget build() + + + <static>+dynamic storeSubject() + <static>+dynamic loadSubject() + <static>+dynamic storeAnalytics() + <static>+dynamic loadAnalytics() + <static>+dynamic delete() + <static>+dynamic synchronize() - - - - + + + + - - - StudySelectionScreen + + + StudyNotification - - - +Widget build() + + + +taskInstance: TaskInstance + +date: DateTime - - - + + + + - - - InviteCodeDialog + + + NotificationValidators - - - - - - - - InterventionSelectionScreen + + + +didNotificationLaunchApp: bool + +wasNotificationActionHandled: bool + +wasNotificationActionCompleted: bool - - - + + + + + - - - KickoffScreen + + + StudyNotifications - - - - - - - - - - _KickoffScreen + + + +subject: StudySubject? + +flutterLocalNotificationsPlugin: FlutterLocalNotificationsPlugin + +context: BuildContext + +didReceiveLocalNotificationStream: StreamController<ReceivedNotification> + +selectNotificationStream: StreamController<String?> + <static>+validator: NotificationValidators + <static>+debug: bool + <static>+scheduledNotificationsDebug: String? - - - +subject: StudySubject? - +ready: bool + + + <static>+dynamic create() + -dynamic _isAndroidPermissionGranted() + -dynamic _requestPermissions() + -void _configureDidReceiveLocalNotificationSubject() + -void _configureSelectNotificationSubject() + -void _initNotificationsPlugin() + +dynamic handleNotificationResponse() - - - -dynamic _storeUserStudy() - -Widget _constructStatusIcon() - -String _getStatusText() - +Widget build() + + + + + + + + FlutterLocalNotificationsPlugin - - - + + + - - - JourneyOverviewScreen + + + BuildContext - - - - - + + + - - - _JourneyOverviewScreen + + + StreamController - - - +subject: StudySubject? + + + + + + + + + ReceivedNotification - - - +dynamic getConsentAndNavigateToDashboard() - +Widget build() + + + +id: int? + +title: String? + +body: String? + +payload: String? - - - - - + + + + + - - - Timeline + + + AppAnalytics - - - +subject: StudySubject? + + + <static>-_userEnabled: bool? + <static>+keyAnalyticsUserEnable: String + +context: BuildContext + +subject: StudySubject? + <static>+isUserEnabled: dynamic - - - +Widget build() + + + <static>+dynamic init() + <static>+dynamic start() + <static>+void setEnabled() + +dynamic initBasic() + +void initAdvanced() - - - - - + + + + + - - - InterventionTile + + + HtmlText - - - +title: String? - +iconName: String - +date: DateTime - +color: Color? - +isFirst: bool - +isLast: bool + + + +text: String? + +style: TextStyle? - - - +Widget build() + + + +Widget build() - - - - - - - - - IconIndicator - - - - - - +iconName: String - +color: Color? - - + + + - - - +Widget build() + + + TextStyle - - - - - + + + + - - - TimelineChild + + + ChoiceQuestionWidget - - - +child: Widget? + + + +question: ChoiceQuestion + +onDone: dynamic Function(Answer<dynamic>) + +multiSelectionText: String + +subtitle: String? - - - +Widget build() + + + + + + + + ChoiceQuestion - - - + + + - - - ConsentScreen + + + dynamic Function(Answer<dynamic>) - - - - - + + + + - - - ConsentCard + + + QuestionWidget - - - +consent: ConsentItem? - +index: int? - +onTapped: dynamic Function(int) - +isChecked: bool? + + + +subtitle: String? - - - +Widget build() + + + + + + + + + AnnotatedScaleQuestionWidget + + + + + + +question: AnnotatedScaleQuestion + +onDone: dynamic Function(Answer<dynamic>)? - - - + + + - - - ConsentItem + + + AnnotatedScaleQuestion - - - + + + - - - dynamic Function(int) + + + dynamic Function(Answer<dynamic>)? - - - - + + + + - - - ConsentElement + + + ScaleQuestionWidget - - - +title: String - +descriptionText: String - +acknowledgmentText: String - +icon: IconData + + + +question: ScaleQuestion + +onDone: dynamic Function(Answer<dynamic>)? - - - + + + - - - IconData + + + ScaleQuestion - - - - + + + + - - - EligibilityResult + + + VisualAnalogueQuestionWidget - - - +eligible: bool - +firstFailed: EligibilityCriterion? + + + +question: VisualAnalogueQuestion + +onDone: dynamic Function(Answer<dynamic>)? - - - + + + - - - EligibilityCriterion + + + VisualAnalogueQuestion - - - - - - - - - EligibilityScreen - - + + + + - - - +study: Study? + + + QuestionnaireWidget - - - <static>+MaterialPageRoute<EligibilityResult> routeFor() + + + +title: String? + +header: String? + +footer: String? + +questions: List<Question<dynamic>> - - - - - + + + + + - - - OnboardingProgress + + + HtmlTextBox - - - +stage: int - +progress: double + + + +text: String? - - - -double _getProgressForStage() - +Widget build() + + + +Widget build() - - - - + + + + - - - TaskOverview + + + BooleanQuestionWidget - - - +subject: StudySubject? - +scheduleToday: List<TaskInstance>? - +interventionIcon: String? + + + +question: BooleanQuestion + +onDone: dynamic Function(Answer<dynamic>)? - - - - - - - - ProgressRow - - + + + - - - +subject: StudySubject? + + + BooleanQuestion - - - - - - - - - InterventionSegment - - + + + + - - - +intervention: Intervention - +percentCompleted: double - +percentMissed: double - +isCurrent: bool - +isFuture: bool - +phaseDuration: int + + + QuestionContainer - - - +List<Widget> buildSeparators() - +Widget build() + + + +onDone: dynamic Function(Answer<dynamic>, int) + +question: Question<dynamic> + +index: int - - - - + + + - - - TaskBox + + + dynamic Function(Answer<dynamic>, int) - - - +taskInstance: TaskInstance - +icon: Icon - +onCompleted: dynamic Function() + + + + + + + + Question - - - + + + + + - - - dynamic Function() + + + QuestionHeader - - - - + + + +prompt: String? + +subtitle: String? + +rationale: String? + + - - - Settings + + + -List<Widget> _buildSubtitle() + -List<Widget> _buildRationaleButton() + +Widget build() - - - - - + + + + + - - - OptOutAlertDialog + + + CustomSlider - - - +subject: StudySubject? + + + +value: double? + +minValue: double? + +maxValue: double? + +minorTick: int? + +onChanged: dynamic Function(double)? + +onChangeEnd: dynamic Function(double)? + +activeColor: Color? + +inactiveColor: Color? + +minColor: Color? + +maxColor: Color? + +thumbColor: Color? + +isColored: bool + +labelValuePrecision: int + +tickValuePrecision: int + +linearStep: bool + +steps: AnnotatedScaleQuestion? - - - +Widget build() + + + +Widget build() - - - - - + + + - - - DeleteAlertDialog + + + dynamic Function(double)? - - - +subject: StudySubject? + + + + + + + + + CustomTrackShape - - - +Widget build() + + + +Rect getPreferredRect() - - - + + + - - - ContactScreen + + + RoundedRectSliderTrackShape - - - - - + + + + + - - - ContactWidget + + + StudyTile - - - +contact: Contact? - +title: String - +subtitle: String? - +color: Color + + + +title: String? + +description: String? + +iconName: String + +onTap: dynamic Function()? + +contentPadding: EdgeInsetsGeometry - - - +Widget build() + + + +Widget build() - - - + + + - - - Contact + + + EdgeInsetsGeometry - - - - - + + + + + - - - ContactItem + + + SelectableButton - - - +iconData: IconData - +itemName: String - +itemValue: String? - +type: ContactItemType? - +iconColor: Color? + + + +child: Widget + +selected: bool + +onTap: dynamic Function()? - - - +dynamic launchContact() - +Widget build() + + + -Color _getFillColor() + -Color _getTextColor() + +Widget build() - - - - + + + + + - - - ContactItemType + + + RoundCheckbox - - - +index: int - <static>+values: List<ContactItemType> - <static>+website: ContactItemType - <static>+email: ContactItemType - <static>+phone: ContactItemType + + + +onChanged: dynamic Function(bool)? + +value: bool? - - - - - - - - Enum + + + +Widget build() - - - - + + + - - - FAQ + + + dynamic Function(bool)? - - - +Widget build() + + + + + + + + + + InterventionCard - - - - - - - - - Entry + + + +intervention: Intervention + +selected: bool + +showCheckbox: bool + +showTasks: bool + +showDescription: bool + +onTap: dynamic Function()? - - - +title: String - +children: List<Entry> + + + +Widget build() - - - - - + + + + + - - - EntryItem + + + InterventionCardTitle - - - +entry: Entry + + + +intervention: Intervention? + +selected: bool + +showCheckbox: bool + +showDescriptionButton: bool + +onTap: dynamic Function()? - - - -Widget _buildTiles() - +Widget build() + + + +Widget build() - - - - - - - - DashboardScreen - - + + + + + - - - +error: String? + + + InterventionCardDescription - - - - - - - - - OverflowMenuItem + + + +intervention: Intervention - - - +name: String - +icon: IconData - +routeName: String? - +onTap: dynamic Function()? + + + +Widget build() - - - - - + + + + + - - - StudyFinishedPlaceholder + + + _TaskList - - - <static>+space: SizedBox + + + +tasks: List<InterventionTask> - - - +Widget build() + + + +String scheduleString() + +Widget build() - - - + + + + + - - - SizedBox + + + BottomOnboardingNavigation - - - - - - - - - MyApp + + + +onBack: void Function()? + +onNext: void Function()? + +backLabel: String? + +nextLabel: String? + +hideNext: bool + +nextIcon: Icon? + +backIcon: Icon? + +progress: Widget? - - - +queryParameters: Map<String, String> - +appConfig: AppConfig? + + + +Widget build() - - - + + + + - - - AppConfig + + + ThemeConfig + + + + + + <static>+SliderThemeData coloredSliderTheme() diff --git a/docs/uml/core/lib/src/models/tables/uml.svg b/docs/uml/core/lib/src/models/tables/uml.svg index b9ec232b4..b88c99600 100644 --- a/docs/uml/core/lib/src/models/tables/uml.svg +++ b/docs/uml/core/lib/src/models/tables/uml.svg @@ -1,148 +1,5 @@ - - [StudyInvite - | - <static>+tableName: String; - +code: String; - +studyId: String; - +preselectedInterventionIds: List<String>?; - +primaryKeys: Map<String, dynamic> - | - +Map<String, dynamic> toJson() - ] - - [<abstract>SupabaseObjectFunctions]<:-[StudyInvite] - - [SubjectProgress - | - <static>+tableName: String; - +completedAt: DateTime?; - +subjectId: String; - +interventionId: String; - +taskId: String; - +resultType: String; - +result: Result<dynamic>; - +startedAt: DateTime?; - +primaryKeys: Map<String, dynamic>; - +hashCode: int - | - +Map<String, dynamic> toJson(); - +SubjectProgress setStartDateBackBy(); - +bool ==() - ] - - [SubjectProgress]o-[Result] - [<abstract>SupabaseObjectFunctions]<:-[SubjectProgress] - - [StudySubject - | - <static>+tableName: String; - -_controller: StreamController<StudySubject>; - +id: String; - +studyId: String; - +userId: String; - +startedAt: DateTime?; - +selectedInterventionIds: List<String>; - +inviteCode: String?; - +isDeleted: bool; - +study: Study; - +progress: List<SubjectProgress>; - +primaryKeys: Map<String, dynamic>; - +interventionOrder: List<String>; - +selectedInterventions: List<Intervention>; - +daysPerIntervention: int; - +minimumStudyLengthCompleted: bool; - +completedStudy: bool; - +onSave: Stream<StudySubject>; - +hashCode: int - | - +Map<String, dynamic> toJson(); - +dynamic addResult(); - +Map<DateTime, List<SubjectProgress>> getResultsByDate(); - +DateTime endDate(); - +int getDayOfStudyFor(); - +int getInterventionIndexForDate(); - +Intervention? getInterventionForDate(); - +List<Intervention> getInterventionsInOrder(); - +DateTime startOfPhase(); - +DateTime dayAfterEndOfPhase(); - +List<SubjectProgress> resultsFor(); - +int completedForPhase(); - +int daysLeftForPhase(); - +double percentCompletedForPhase(); - +double percentMissedForPhase(); - +List<SubjectProgress> getTaskProgressForDay(); - +bool completedTaskInstanceForDay(); - +bool completedTaskForDay(); - +int completedTasksFor(); - +bool allTasksCompletedFor(); - +int totalTaskCountFor(); - +List<TaskInstance> scheduleFor(); - +dynamic setStartDateBackBy(); - +dynamic save(); - +Map<String, dynamic> toFullJson(); - +dynamic deleteProgress(); - +dynamic delete(); - +dynamic softDelete(); - <static>+dynamic getStudyHistory(); - +bool ==(); - +String toString() - ] - - [StudySubject]o-[StreamController] - [StudySubject]o-[Study] - [StudySubject]o-[Stream] - [<abstract>SupabaseObjectFunctions]<:-[StudySubject] - - [AppConfig - | - <static>+tableName: String; - +id: String; - +contact: Contact; - +appPrivacy: Map<String, String>; - +appTerms: Map<String, String>; - +designerPrivacy: Map<String, String>; - +designerTerms: Map<String, String>; - +imprint: Map<String, String>; - +analytics: StudyUAnalytics; - +primaryKeys: Map<String, dynamic> - | - +Map<String, dynamic> toJson(); - <static>+dynamic getAppConfig(); - <static>+dynamic getAppContact() - ] - - [AppConfig]o-[Contact] - [AppConfig]o-[StudyUAnalytics] - [<abstract>SupabaseObjectFunctions]<:-[AppConfig] - - [Repo - | - <static>+tableName: String; - +projectId: String; - +userId: String; - +studyId: String; - +provider: GitProvider; - +webUrl: String; - +gitUrl: String; - +primaryKeys: Map<String, dynamic> - | - +Map<String, dynamic> toJson() - ] - - [Repo]o-[GitProvider] - [<abstract>SupabaseObjectFunctions]<:-[Repo] - - [GitProvider - | - +index: int; - <static>+values: List<GitProvider>; - <static>+gitlab: GitProvider - ] - - [GitProvider]o-[GitProvider] - [Enum]<:--[GitProvider] - - [Study + + [Study | <static>+tableName: String; <static>+baselineID: String; @@ -192,7 +49,8 @@ +bool canEdit(); <static>+dynamic fetchResultsCSVTable(); +bool isReadonly(); - +String toString() + +String toString(); + +int compareTo() ] [Study]o-[Participation] @@ -204,6 +62,7 @@ [Study]o-[Repo] [Study]o-[StudyStatus] [<abstract>SupabaseObjectFunctions]<:-[Study] + [Comparable]<:--[Study] [StudyStatus | @@ -240,302 +99,306 @@ [ResultSharing]o-[ResultSharing] [Enum]<:--[ResultSharing] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - StudyInvite - - - - - - <static>+tableName: String - +code: String - +studyId: String - +preselectedInterventionIds: List<String>? - +primaryKeys: Map<String, dynamic> - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - SupabaseObjectFunctions - - - - - - - - - - - - - SubjectProgress - - - - - - <static>+tableName: String - +completedAt: DateTime? - +subjectId: String - +interventionId: String - +taskId: String - +resultType: String - +result: Result<dynamic> - +startedAt: DateTime? - +primaryKeys: Map<String, dynamic> - +hashCode: int - - - - - - +Map<String, dynamic> toJson() - +SubjectProgress setStartDateBackBy() - +bool ==() - - - - - - - - - - - Result - - - + [AppConfig + | + <static>+tableName: String; + +id: String; + +contact: Contact; + +appPrivacy: Map<String, String>; + +appTerms: Map<String, String>; + +designerPrivacy: Map<String, String>; + +designerTerms: Map<String, String>; + +imprint: Map<String, String>; + +analytics: StudyUAnalytics; + +primaryKeys: Map<String, dynamic> + | + +Map<String, dynamic> toJson(); + <static>+dynamic getAppConfig(); + <static>+dynamic getAppContact() + ] + + [AppConfig]o-[Contact] + [AppConfig]o-[StudyUAnalytics] + [<abstract>SupabaseObjectFunctions]<:-[AppConfig] + + [SubjectProgress + | + <static>+tableName: String; + +completedAt: DateTime?; + +subjectId: String; + +interventionId: String; + +taskId: String; + +resultType: String; + +result: Result<dynamic>; + +startedAt: DateTime?; + +primaryKeys: Map<String, dynamic>; + +hashCode: int + | + +Map<String, dynamic> toJson(); + +SubjectProgress setStartDateBackBy(); + +bool ==() + ] + + [SubjectProgress]o-[Result] + [<abstract>SupabaseObjectFunctions]<:-[SubjectProgress] + + [StudyInvite + | + <static>+tableName: String; + +code: String; + +studyId: String; + +preselectedInterventionIds: List<String>?; + +primaryKeys: Map<String, dynamic> + | + +Map<String, dynamic> toJson() + ] + + [<abstract>SupabaseObjectFunctions]<:-[StudyInvite] + + [StudyUUser + | + <static>+tableName: String; + +id: String; + +email: String; + +preferences: Preferences; + +primaryKeys: Map<String, dynamic> + | + +Map<String, dynamic> toJson() + ] + + [StudyUUser]o-[Preferences] + [<abstract>SupabaseObjectFunctions]<:-[StudyUUser] + + [Preferences + | + +language: String; + +pinnedStudies: Set<String> + | + +Map<String, dynamic> toJson() + ] + + [Repo + | + <static>+tableName: String; + +projectId: String; + +userId: String; + +studyId: String; + +provider: GitProvider; + +webUrl: String?; + +gitUrl: String?; + +primaryKeys: Map<String, dynamic> + | + +Map<String, dynamic> toJson() + ] + + [Repo]o-[GitProvider] + [<abstract>SupabaseObjectFunctions]<:-[Repo] + + [GitProvider + | + +index: int; + <static>+values: List<GitProvider>; + <static>+gitlab: GitProvider + ] + + [GitProvider]o-[GitProvider] + [Enum]<:--[GitProvider] + + [StudySubject + | + <static>+tableName: String; + -_controller: StreamController<StudySubject>; + +id: String; + +studyId: String; + +userId: String; + +startedAt: DateTime?; + +selectedInterventionIds: List<String>; + +inviteCode: String?; + +isDeleted: bool; + +study: Study; + +progress: List<SubjectProgress>; + +primaryKeys: Map<String, dynamic>; + +interventionOrder: List<String>; + +selectedInterventions: List<Intervention>; + +daysPerIntervention: int; + +minimumStudyLengthCompleted: bool; + +completedStudy: bool; + +onSave: Stream<StudySubject>; + +hashCode: int + | + +Map<String, dynamic> toJson(); + +dynamic addResult(); + +Map<DateTime, List<SubjectProgress>> getResultsByDate(); + +DateTime endDate(); + +int getDayOfStudyFor(); + +int getInterventionIndexForDate(); + +Intervention? getInterventionForDate(); + +List<Intervention> getInterventionsInOrder(); + +DateTime startOfPhase(); + +DateTime dayAfterEndOfPhase(); + +List<SubjectProgress> resultsFor(); + +int completedForPhase(); + +int daysLeftForPhase(); + +double percentCompletedForPhase(); + +double percentMissedForPhase(); + +List<SubjectProgress> getTaskProgressForDay(); + +bool completedTaskInstanceForDay(); + +bool completedTaskForDay(); + +int completedTasksFor(); + +bool allTasksCompletedFor(); + +int totalTaskCountFor(); + +List<TaskInstance> scheduleFor(); + +dynamic setStartDateBackBy(); + +dynamic save(); + +Map<String, dynamic> toFullJson(); + +dynamic deleteProgress(); + +dynamic delete(); + +dynamic softDelete(); + <static>+dynamic getStudyHistory(); + +bool ==(); + +String toString() + ] + + [StudySubject]o-[StreamController] + [StudySubject]o-[Study] + [StudySubject]o-[Stream] + [<abstract>SupabaseObjectFunctions]<:-[StudySubject] + + + + + + + + + + + + - - - - - - - - - StudySubject - - - - - - <static>+tableName: String - -_controller: StreamController<StudySubject> - +id: String - +studyId: String - +userId: String - +startedAt: DateTime? - +selectedInterventionIds: List<String> - +inviteCode: String? - +isDeleted: bool - +study: Study - +progress: List<SubjectProgress> - +primaryKeys: Map<String, dynamic> - +interventionOrder: List<String> - +selectedInterventions: List<Intervention> - +daysPerIntervention: int - +minimumStudyLengthCompleted: bool - +completedStudy: bool - +onSave: Stream<StudySubject> - +hashCode: int - - - - - - +Map<String, dynamic> toJson() - +dynamic addResult() - +Map<DateTime, List<SubjectProgress>> getResultsByDate() - +DateTime endDate() - +int getDayOfStudyFor() - +int getInterventionIndexForDate() - +Intervention? getInterventionForDate() - +List<Intervention> getInterventionsInOrder() - +DateTime startOfPhase() - +DateTime dayAfterEndOfPhase() - +List<SubjectProgress> resultsFor() - +int completedForPhase() - +int daysLeftForPhase() - +double percentCompletedForPhase() - +double percentMissedForPhase() - +List<SubjectProgress> getTaskProgressForDay() - +bool completedTaskInstanceForDay() - +bool completedTaskForDay() - +int completedTasksFor() - +bool allTasksCompletedFor() - +int totalTaskCountFor() - +List<TaskInstance> scheduleFor() - +dynamic setStartDateBackBy() - +dynamic save() - +Map<String, dynamic> toFullJson() - +dynamic deleteProgress() - +dynamic delete() - +dynamic softDelete() - <static>+dynamic getStudyHistory() - +bool ==() - +String toString() - - - + + + - - - - - - - StreamController - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - + Study - + <static>+tableName: String <static>+baselineID: String @@ -579,45 +442,209 @@ - - - +Map<String, dynamic> toJson() - <static>+dynamic getResearcherDashboardStudies() - <static>+dynamic publishedPublicStudies() - +bool isOwner() - +bool isEditor() - +bool canEdit() - <static>+dynamic fetchResultsCSVTable() - +bool isReadonly() - +String toString() + + + +Map<String, dynamic> toJson() + <static>+dynamic getResearcherDashboardStudies() + <static>+dynamic publishedPublicStudies() + +bool isOwner() + +bool isEditor() + +bool canEdit() + <static>+dynamic fetchResultsCSVTable() + +bool isReadonly() + +String toString() + +int compareTo() + + + + + + + + + + + + Participation + + + + + + +index: int + <static>+values: List<Participation> + <static>+open: Participation + <static>+invite: Participation + + + + + + + + + + + + ResultSharing + + + + + + +index: int + <static>+values: List<ResultSharing> + <static>+public: ResultSharing + <static>+private: ResultSharing + <static>+organization: ResultSharing + + + + + + + + + + + Contact + + + + + + + + + + + StudyUQuestionnaire + + + + + + + + + + + StudySchedule + + + + + + + + + + + ReportSpecification + + + + + + + + + + + + + Repo + + + + + + <static>+tableName: String + +projectId: String + +userId: String + +studyId: String + +provider: GitProvider + +webUrl: String? + +gitUrl: String? + +primaryKeys: Map<String, dynamic> + + + + + + +Map<String, dynamic> toJson() - - - + + + + - - - Stream + + + StudyStatus + + + + + + +index: int + <static>+values: List<StudyStatus> + <static>+draft: StudyStatus + <static>+running: StudyStatus + <static>+closed: StudyStatus + + + + + + + + + + + SupabaseObjectFunctions + + + + + + + + + + + Comparable + + + + + + + + + + + Enum - - - + + + - + AppConfig - + <static>+tableName: String +id: String @@ -632,7 +659,7 @@ - + +Map<String, dynamic> toJson() <static>+dynamic getAppConfig() @@ -641,185 +668,259 @@ - - - - - - - Contact - - - - - + - + StudyUAnalytics - - - - - + + + + + - - - Repo + + + SubjectProgress - - - <static>+tableName: String - +projectId: String - +userId: String - +studyId: String - +provider: GitProvider - +webUrl: String - +gitUrl: String - +primaryKeys: Map<String, dynamic> + + + <static>+tableName: String + +completedAt: DateTime? + +subjectId: String + +interventionId: String + +taskId: String + +resultType: String + +result: Result<dynamic> + +startedAt: DateTime? + +primaryKeys: Map<String, dynamic> + +hashCode: int - - - +Map<String, dynamic> toJson() + + + +Map<String, dynamic> toJson() + +SubjectProgress setStartDateBackBy() + +bool ==() - - - - + + + - - - GitProvider + + + Result - - - +index: int - <static>+values: List<GitProvider> - <static>+gitlab: GitProvider + + + + + + + + + + StudyInvite - - - - + + + <static>+tableName: String + +code: String + +studyId: String + +preselectedInterventionIds: List<String>? + +primaryKeys: Map<String, dynamic> + + - - - Enum + + + +Map<String, dynamic> toJson() - - - - + + + + + - - - Participation + + + StudyUUser - - - +index: int - <static>+values: List<Participation> - <static>+open: Participation - <static>+invite: Participation + + + <static>+tableName: String + +id: String + +email: String + +preferences: Preferences + +primaryKeys: Map<String, dynamic> + + + + + + +Map<String, dynamic> toJson() - - - - + + + + + - - - ResultSharing + + + Preferences - - - +index: int - <static>+values: List<ResultSharing> - <static>+public: ResultSharing - <static>+private: ResultSharing - <static>+organization: ResultSharing + + + +language: String + +pinnedStudies: Set<String> + + + + + + +Map<String, dynamic> toJson() - - - + + + + - - - StudyUQuestionnaire + + + GitProvider + + + + + + +index: int + <static>+values: List<GitProvider> + <static>+gitlab: GitProvider - - - + + + + + - - - StudySchedule + + + StudySubject - - - - + + + <static>+tableName: String + -_controller: StreamController<StudySubject> + +id: String + +studyId: String + +userId: String + +startedAt: DateTime? + +selectedInterventionIds: List<String> + +inviteCode: String? + +isDeleted: bool + +study: Study + +progress: List<SubjectProgress> + +primaryKeys: Map<String, dynamic> + +interventionOrder: List<String> + +selectedInterventions: List<Intervention> + +daysPerIntervention: int + +minimumStudyLengthCompleted: bool + +completedStudy: bool + +onSave: Stream<StudySubject> + +hashCode: int + + - - - ReportSpecification + + + +Map<String, dynamic> toJson() + +dynamic addResult() + +Map<DateTime, List<SubjectProgress>> getResultsByDate() + +DateTime endDate() + +int getDayOfStudyFor() + +int getInterventionIndexForDate() + +Intervention? getInterventionForDate() + +List<Intervention> getInterventionsInOrder() + +DateTime startOfPhase() + +DateTime dayAfterEndOfPhase() + +List<SubjectProgress> resultsFor() + +int completedForPhase() + +int daysLeftForPhase() + +double percentCompletedForPhase() + +double percentMissedForPhase() + +List<SubjectProgress> getTaskProgressForDay() + +bool completedTaskInstanceForDay() + +bool completedTaskForDay() + +int completedTasksFor() + +bool allTasksCompletedFor() + +int totalTaskCountFor() + +List<TaskInstance> scheduleFor() + +dynamic setStartDateBackBy() + +dynamic save() + +Map<String, dynamic> toFullJson() + +dynamic deleteProgress() + +dynamic delete() + +dynamic softDelete() + <static>+dynamic getStudyHistory() + +bool ==() + +String toString() - - - - + + + - - - StudyStatus + + + StreamController - - - +index: int - <static>+values: List<StudyStatus> - <static>+draft: StudyStatus - <static>+running: StudyStatus - <static>+closed: StudyStatus + + + + + + + + Stream diff --git a/docs/uml/core/lib/src/models/uml.svg b/docs/uml/core/lib/src/models/uml.svg index ff4393eef..095b3594d 100644 --- a/docs/uml/core/lib/src/models/uml.svg +++ b/docs/uml/core/lib/src/models/uml.svg @@ -1,82 +1,99 @@ - - [<abstract>StudyResult + + [DataReference | - <static>+studyResultTypes: Map<String, StudyResult Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String; - +id: String; - +filename: String + +task: String; + +property: String | +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() + +String toString(); + +Map<DateTime, T> retrieveFromResults() ] - [NumericResult + [AverageSection | - <static>+studyResultType: String; - +resultProperty: DataReference<num> + <static>+sectionType: String; + +aggregate: TemporalAggregation?; + +resultProperty: DataReference<num>? | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() + +Map<String, dynamic> toJson() ] - [NumericResult]o-[DataReference] - [<abstract>StudyResult]<:-[NumericResult] + [AverageSection]o-[TemporalAggregation] + [AverageSection]o-[DataReference] + [<abstract>ReportSection]<:-[AverageSection] - [InterventionResult + [LinearRegressionSection | - <static>+studyResultType: String + <static>+sectionType: String; + +resultProperty: DataReference<num>?; + +alpha: double; + +improvement: ImprovementDirection? | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() + +Map<String, dynamic> toJson() ] - [<abstract>StudyResult]<:-[InterventionResult] + [LinearRegressionSection]o-[DataReference] + [LinearRegressionSection]o-[ImprovementDirection] + [<abstract>ReportSection]<:-[LinearRegressionSection] - [<abstract>InterventionTask + [ImprovementDirection | - <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> + +index: int; + <static>+values: List<ImprovementDirection>; + <static>+positive: ImprovementDirection; + <static>+negative: ImprovementDirection ] - [<abstract>Task]<:-[<abstract>InterventionTask] + [ImprovementDirection]o-[ImprovementDirection] + [Enum]<:--[ImprovementDirection] - [Intervention + [TemporalAggregation | - +id: String; - +name: String?; - +description: String?; - +icon: String; - +tasks: List<InterventionTask> + +index: int; + <static>+values: List<TemporalAggregation>; + <static>+day: TemporalAggregation; + <static>+phase: TemporalAggregation; + <static>+intervention: TemporalAggregation + ] + + [TemporalAggregation]o-[TemporalAggregation] + [Enum]<:--[TemporalAggregation] + + [ReportSpecification + | + +primary: ReportSection?; + +secondary: List<ReportSection> | +Map<String, dynamic> toJson(); - +bool isBaseline() + +String toString() ] - [CheckmarkTask + [ReportSpecification]o-[<abstract>ReportSection] + + [<abstract>ReportSection | - <static>+taskType: String + <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)>; + <static>+keyType: String; + +type: String; + +id: String; + +title: String?; + +description: String? | +Map<String, dynamic> toJson(); - +Map<DateTime, T> extractPropertyResults(); - +Map<String, Type> getAvailableProperties(); - +String? getHumanReadablePropertyName() + +String toString() ] - [<abstract>InterventionTask]<:-[CheckmarkTask] - - [<abstract>ValueExpression + [NotExpression | <static>+expressionType: String; - +target: String? + +expression: Expression | - +bool checkValue(); + +Map<String, dynamic> toJson(); +bool? evaluate() ] - [<abstract>Expression]<:-[<abstract>ValueExpression] + [NotExpression]o-[<abstract>Expression] + [<abstract>Expression]<:-[NotExpression] [BooleanExpression | @@ -88,28 +105,27 @@ [<abstract>ValueExpression]<:-[BooleanExpression] - [ChoiceExpression + [<abstract>ValueExpression | <static>+expressionType: String; - +choices: Set<dynamic> + +target: String? | - +Map<String, dynamic> toJson(); - +bool checkValue() + +bool checkValue(); + +bool? evaluate() ] - [<abstract>ValueExpression]<:-[ChoiceExpression] + [<abstract>Expression]<:-[<abstract>ValueExpression] - [NotExpression + [ChoiceExpression | <static>+expressionType: String; - +expression: Expression + +choices: Set<dynamic> | +Map<String, dynamic> toJson(); - +bool? evaluate() + +bool checkValue() ] - [NotExpression]o-[<abstract>Expression] - [<abstract>Expression]<:-[NotExpression] + [<abstract>ValueExpression]<:-[ChoiceExpression] [<abstract>Expression | @@ -122,354 +138,288 @@ +bool? evaluate() ] - [DataReference + [<abstract>StudyResult | - +task: String; - +property: String + <static>+studyResultTypes: Map<String, StudyResult Function(Map<String, dynamic>)>; + <static>+keyType: String; + +type: String; + +id: String; + +filename: String | +Map<String, dynamic> toJson(); - +String toString(); - +Map<DateTime, T> retrieveFromResults() + +List<String> getHeaders(); + +List<dynamic> getValues() ] - [StudyInvite + [InterventionResult | - <static>+tableName: String; - +code: String; - +studyId: String; - +preselectedInterventionIds: List<String>?; - +primaryKeys: Map<String, dynamic> + <static>+studyResultType: String | - +Map<String, dynamic> toJson() + +Map<String, dynamic> toJson(); + +List<String> getHeaders(); + +List<dynamic> getValues() ] - [<abstract>SupabaseObjectFunctions]<:-[StudyInvite] + [<abstract>StudyResult]<:-[InterventionResult] - [SubjectProgress + [NumericResult | - <static>+tableName: String; - +completedAt: DateTime?; - +subjectId: String; - +interventionId: String; - +taskId: String; - +resultType: String; - +result: Result<dynamic>; - +startedAt: DateTime?; - +primaryKeys: Map<String, dynamic>; - +hashCode: int + <static>+studyResultType: String; + +resultProperty: DataReference<num> | +Map<String, dynamic> toJson(); - +SubjectProgress setStartDateBackBy(); - +bool ==() + +List<String> getHeaders(); + +List<dynamic> getValues() ] - [SubjectProgress]o-[Result] - [<abstract>SupabaseObjectFunctions]<:-[SubjectProgress] + [NumericResult]o-[DataReference] + [<abstract>StudyResult]<:-[NumericResult] - [StudySubject + [ConsentItem | - <static>+tableName: String; - -_controller: StreamController<StudySubject>; +id: String; - +studyId: String; - +userId: String; - +startedAt: DateTime?; - +selectedInterventionIds: List<String>; - +inviteCode: String?; - +isDeleted: bool; - +study: Study; - +progress: List<SubjectProgress>; - +primaryKeys: Map<String, dynamic>; - +interventionOrder: List<String>; - +selectedInterventions: List<Intervention>; - +daysPerIntervention: int; - +minimumStudyLengthCompleted: bool; - +completedStudy: bool; - +onSave: Stream<StudySubject>; - +hashCode: int + +title: String?; + +description: String?; + +iconName: String | +Map<String, dynamic> toJson(); - +dynamic addResult(); - +Map<DateTime, List<SubjectProgress>> getResultsByDate(); - +DateTime endDate(); - +int getDayOfStudyFor(); - +int getInterventionIndexForDate(); - +Intervention? getInterventionForDate(); - +List<Intervention> getInterventionsInOrder(); - +DateTime startOfPhase(); - +DateTime dayAfterEndOfPhase(); - +List<SubjectProgress> resultsFor(); - +int completedForPhase(); - +int daysLeftForPhase(); - +double percentCompletedForPhase(); - +double percentMissedForPhase(); - +List<SubjectProgress> getTaskProgressForDay(); - +bool completedTaskInstanceForDay(); - +bool completedTaskForDay(); - +int completedTasksFor(); - +bool allTasksCompletedFor(); - +int totalTaskCountFor(); - +List<TaskInstance> scheduleFor(); - +dynamic setStartDateBackBy(); - +dynamic save(); - +Map<String, dynamic> toFullJson(); - +dynamic deleteProgress(); - +dynamic delete(); - +dynamic softDelete(); - <static>+dynamic getStudyHistory(); - +bool ==(); +String toString() ] - [StudySubject]o-[StreamController] - [StudySubject]o-[Study] - [StudySubject]o-[Stream] - [<abstract>SupabaseObjectFunctions]<:-[StudySubject] - - [AppConfig + [QuestionConditional | - <static>+tableName: String; - +id: String; - +contact: Contact; - +appPrivacy: Map<String, String>; - +appTerms: Map<String, String>; - +designerPrivacy: Map<String, String>; - +designerTerms: Map<String, String>; - +imprint: Map<String, String>; - +analytics: StudyUAnalytics; - +primaryKeys: Map<String, dynamic> + <static>+keyDefaultValue: String; + +defaultValue: V?; + +condition: Expression | - +Map<String, dynamic> toJson(); - <static>+dynamic getAppConfig(); - <static>+dynamic getAppContact() + <static>-QuestionConditional<V> _fromJson(); + +Map<String, dynamic> toJson() ] - [AppConfig]o-[Contact] - [AppConfig]o-[StudyUAnalytics] - [<abstract>SupabaseObjectFunctions]<:-[AppConfig] + [QuestionConditional]o-[<abstract>Expression] - [Repo + [<abstract>Question | - <static>+tableName: String; - +projectId: String; - +userId: String; - +studyId: String; - +provider: GitProvider; - +webUrl: String; - +gitUrl: String; - +primaryKeys: Map<String, dynamic> + <static>+questionTypes: Map<String, Question<dynamic> Function(Map<String, dynamic>)>; + <static>+keyType: String; + +type: String; + +id: String; + +prompt: String?; + +rationale: String?; + <static>+keyConditional: String; + +conditional: QuestionConditional<V>? | - +Map<String, dynamic> toJson() + +Map<String, dynamic> toJson(); + +bool shouldBeShown(); + +Answer<V>? getDefaultAnswer(); + +Type getAnswerType(); + +String toString() ] - [Repo]o-[GitProvider] - [<abstract>SupabaseObjectFunctions]<:-[Repo] + [<abstract>Question]o-[QuestionConditional] - [GitProvider + [ChoiceQuestion | - +index: int; - <static>+values: List<GitProvider>; - <static>+gitlab: GitProvider + <static>+questionType: String; + +multiple: bool; + +choices: List<Choice> + | + +Map<String, dynamic> toJson(); + +Answer<List<String>> constructAnswer() ] - [GitProvider]o-[GitProvider] - [Enum]<:--[GitProvider] + [<abstract>Question]<:-[ChoiceQuestion] - [Study + [Choice | - <static>+tableName: String; - <static>+baselineID: String; +id: String; - +title: String?; - +description: String?; - +userId: String; - +participation: Participation; - +resultSharing: ResultSharing; - +contact: Contact; - +iconName: String; - +published: bool; - +questionnaire: StudyUQuestionnaire; - +eligibilityCriteria: List<EligibilityCriterion>; - +consent: List<ConsentItem>; - +interventions: List<Intervention>; - +observations: List<Observation>; - +schedule: StudySchedule; - +reportSpecification: ReportSpecification; - +results: List<StudyResult>; - +collaboratorEmails: List<String>; - +registryPublished: bool; - +participantCount: int; - +endedCount: int; - +activeSubjectCount: int; - +missedDays: List<int>; - +repo: Repo?; - +invites: List<StudyInvite>?; - +participants: List<StudySubject>?; - +participantsProgress: List<SubjectProgress>?; - +createdAt: DateTime?; - +primaryKeys: Map<String, dynamic>; - +hasEligibilityCheck: bool; - +hasConsentCheck: bool; - +totalMissedDays: int; - +percentageMissedDays: double; - +status: StudyStatus; - +isDraft: bool; - +isRunning: bool; - +isClosed: bool + +text: String | +Map<String, dynamic> toJson(); - <static>+dynamic getResearcherDashboardStudies(); - <static>+dynamic publishedPublicStudies(); - +bool isOwner(); - +bool isEditor(); - +bool canEdit(); - <static>+dynamic fetchResultsCSVTable(); - +bool isReadonly(); +String toString() ] - [Study]o-[Participation] - [Study]o-[ResultSharing] - [Study]o-[Contact] - [Study]o-[StudyUQuestionnaire] - [Study]o-[StudySchedule] - [Study]o-[ReportSpecification] - [Study]o-[Repo] - [Study]o-[StudyStatus] - [<abstract>SupabaseObjectFunctions]<:-[Study] - - [StudyStatus + [BooleanQuestion | - +index: int; - <static>+values: List<StudyStatus>; - <static>+draft: StudyStatus; - <static>+running: StudyStatus; - <static>+closed: StudyStatus - ] - - [StudyStatus]o-[StudyStatus] - [Enum]<:--[StudyStatus] - - [Participation + <static>+questionType: String | - +index: int; - <static>+values: List<Participation>; - <static>+open: Participation; - <static>+invite: Participation + +Map<String, dynamic> toJson(); + +Answer<bool> constructAnswer() ] - [Participation]o-[Participation] - [Enum]<:--[Participation] + [<abstract>Question]<:-[BooleanQuestion] - [ResultSharing + [<abstract>SliderQuestion | - +index: int; - <static>+values: List<ResultSharing>; - <static>+public: ResultSharing; - <static>+private: ResultSharing; - <static>+organization: ResultSharing + +minimum: double; + +maximum: double; + -_initial: double; + +step: double; + +initial: double + | + +Answer<num> constructAnswer() ] - [ResultSharing]o-[ResultSharing] - [Enum]<:--[ResultSharing] + [<abstract>Question]<:-[<abstract>SliderQuestion] - [LinearRegressionSection + [ScaleQuestion | - <static>+sectionType: String; - +resultProperty: DataReference<num>?; - +alpha: double; - +improvement: ImprovementDirection? + <static>+questionType: String; + +annotations: List<Annotation>; + +minColor: int?; + +maxColor: int?; + -_step: double; + +step: double; + +isAutostep: bool; + +autostep: int; + +annotationsSorted: List<Annotation>; + +minAnnotation: Annotation?; + +maxAnnotation: Annotation?; + +minLabel: String?; + +maxLabel: String?; + +midAnnotations: List<Annotation>; + +midLabels: List<String>; + +midValues: List<double>; + +values: List<double>; + +minimumAnnotation: String; + +maximumAnnotation: String; + +maximumColor: int; + +minimumColor: int | - +Map<String, dynamic> toJson() + +Map<String, dynamic> toJson(); + +Annotation addAnnotation(); + -void _setAnnotationLabel(); + <static>+int getAutostepSize(); + <static>+List<int> generateMidValues() ] - [LinearRegressionSection]o-[DataReference] - [LinearRegressionSection]o-[ImprovementDirection] - [<abstract>ReportSection]<:-[LinearRegressionSection] + [ScaleQuestion]o-[Annotation] + [<abstract>SliderQuestion]<:-[ScaleQuestion] + [AnnotatedScaleQuestion]<:--[ScaleQuestion] + [VisualAnalogueQuestion]<:--[ScaleQuestion] - [ImprovementDirection + [AnnotatedScaleQuestion | - +index: int; - <static>+values: List<ImprovementDirection>; - <static>+positive: ImprovementDirection; - <static>+negative: ImprovementDirection + <static>+questionType: String; + +annotations: List<Annotation> + | + +Map<String, dynamic> toJson() ] - [ImprovementDirection]o-[ImprovementDirection] - [Enum]<:--[ImprovementDirection] + [<abstract>SliderQuestion]<:-[AnnotatedScaleQuestion] - [AverageSection + [Annotation | - <static>+sectionType: String; - +aggregate: TemporalAggregation?; - +resultProperty: DataReference<num>? + +value: int; + +annotation: String | +Map<String, dynamic> toJson() ] - [AverageSection]o-[TemporalAggregation] - [AverageSection]o-[DataReference] - [<abstract>ReportSection]<:-[AverageSection] - - [TemporalAggregation + [VisualAnalogueQuestion | - +index: int; - <static>+values: List<TemporalAggregation>; - <static>+day: TemporalAggregation; - <static>+phase: TemporalAggregation; - <static>+intervention: TemporalAggregation + <static>+questionType: String; + +minimumColor: int; + +maximumColor: int; + +minimumAnnotation: String; + +maximumAnnotation: String + | + +Map<String, dynamic> toJson() ] - [TemporalAggregation]o-[TemporalAggregation] - [Enum]<:--[TemporalAggregation] + [<abstract>SliderQuestion]<:-[VisualAnalogueQuestion] - [ReportSpecification + [Answer | - +primary: ReportSection?; - +secondary: List<ReportSection> + +question: String; + +timestamp: DateTime; + <static>+keyResponse: String; + +response: V | +Map<String, dynamic> toJson(); + <static>+Answer<dynamic> fromJson(); +String toString() ] - [ReportSpecification]o-[<abstract>ReportSection] + [StudyUQuestionnaire + | + +questions: List<Question<dynamic>> + | + +List<dynamic> toJson() + ] - [<abstract>ReportSection + [EligibilityCriterion | - <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String; +id: String; - +title: String?; - +description: String? + +reason: String?; + +condition: Expression | +Map<String, dynamic> toJson(); - +String toString() + +bool isSatisfied(); + +bool isViolated() ] - [ConsentItem + [EligibilityCriterion]o-[<abstract>Expression] + + [StudySchedule | - +id: String; - +title: String?; - +description: String?; - +iconName: String + <static>+numberOfInterventions: int; + +numberOfCycles: int; + +phaseDuration: int; + +includeBaseline: bool; + +sequence: PhaseSequence; + +sequenceCustom: String; + +length: int; + +nameOfSequence: String | +Map<String, dynamic> toJson(); + +int getNumberOfPhases(); + +List<int> generateWith(); + -int _nextIntervention(); + -List<int> _generateCycle(); + -List<int> _generateAlternatingCycle(); + -List<int> _generateCounterBalancedCycle(); + -List<int> _generateRandomizedCycle(); + -List<int> _generateCustomizedCycle(); +String toString() ] - [Result + [StudySchedule]o-[PhaseSequence] + + [PhaseSequence | - <static>+keyType: String; - +type: String; - +periodId: String?; - <static>+keyResult: String; - +result: T + +index: int; + <static>+values: List<PhaseSequence>; + <static>+alternating: PhaseSequence; + <static>+counterBalanced: PhaseSequence; + <static>+randomized: PhaseSequence; + <static>+customized: PhaseSequence + ] + + [PhaseSequence]o-[PhaseSequence] + [Enum]<:--[PhaseSequence] + + [QuestionnaireTask + | + <static>+taskType: String; + +questions: StudyUQuestionnaire | +Map<String, dynamic> toJson(); - <static>-Result<dynamic> _fromJson() + +Map<DateTime, T> extractPropertyResults(); + +Map<String, Type> getAvailableProperties(); + +String? getHumanReadablePropertyName() + ] + + [QuestionnaireTask]o-[StudyUQuestionnaire] + [<abstract>Observation]<:-[QuestionnaireTask] + + [<abstract>Observation + | + <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> ] + [<abstract>Task]<:-[<abstract>Observation] + [Schedule | +completionPeriods: List<CompletionPeriod>; @@ -535,200 +485,305 @@ [<abstract>Task]o-[Schedule] - [Contact + [Result | - +organization: String; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String; - +website: String; - +phone: String; - +additionalInfo: String? + <static>+keyType: String; + +type: String; + +periodId: String?; + <static>+keyResult: String; + +result: T | +Map<String, dynamic> toJson(); - +String toString() + <static>-Result<dynamic> _fromJson() ] - [Answer + [Study | - +question: String; - +timestamp: DateTime; - <static>+keyResponse: String; - +response: V + <static>+tableName: String; + <static>+baselineID: String; + +id: String; + +title: String?; + +description: String?; + +userId: String; + +participation: Participation; + +resultSharing: ResultSharing; + +contact: Contact; + +iconName: String; + +published: bool; + +questionnaire: StudyUQuestionnaire; + +eligibilityCriteria: List<EligibilityCriterion>; + +consent: List<ConsentItem>; + +interventions: List<Intervention>; + +observations: List<Observation>; + +schedule: StudySchedule; + +reportSpecification: ReportSpecification; + +results: List<StudyResult>; + +collaboratorEmails: List<String>; + +registryPublished: bool; + +participantCount: int; + +endedCount: int; + +activeSubjectCount: int; + +missedDays: List<int>; + +repo: Repo?; + +invites: List<StudyInvite>?; + +participants: List<StudySubject>?; + +participantsProgress: List<SubjectProgress>?; + +createdAt: DateTime?; + +primaryKeys: Map<String, dynamic>; + +hasEligibilityCheck: bool; + +hasConsentCheck: bool; + +totalMissedDays: int; + +percentageMissedDays: double; + +status: StudyStatus; + +isDraft: bool; + +isRunning: bool; + +isClosed: bool | +Map<String, dynamic> toJson(); - <static>+Answer<dynamic> fromJson(); - +String toString() + <static>+dynamic getResearcherDashboardStudies(); + <static>+dynamic publishedPublicStudies(); + +bool isOwner(); + +bool isEditor(); + +bool canEdit(); + <static>+dynamic fetchResultsCSVTable(); + +bool isReadonly(); + +String toString(); + +int compareTo() ] - [QuestionConditional - | - <static>+keyDefaultValue: String; - +defaultValue: V?; - +condition: Expression + [Study]o-[Participation] + [Study]o-[ResultSharing] + [Study]o-[Contact] + [Study]o-[StudyUQuestionnaire] + [Study]o-[StudySchedule] + [Study]o-[ReportSpecification] + [Study]o-[Repo] + [Study]o-[StudyStatus] + [<abstract>SupabaseObjectFunctions]<:-[Study] + [Comparable]<:--[Study] + + [StudyStatus | - <static>-QuestionConditional<V> _fromJson(); - +Map<String, dynamic> toJson() + +index: int; + <static>+values: List<StudyStatus>; + <static>+draft: StudyStatus; + <static>+running: StudyStatus; + <static>+closed: StudyStatus ] - [QuestionConditional]o-[<abstract>Expression] + [StudyStatus]o-[StudyStatus] + [Enum]<:--[StudyStatus] - [StudyUQuestionnaire + [Participation | - +questions: List<Question<dynamic>> + +index: int; + <static>+values: List<Participation>; + <static>+open: Participation; + <static>+invite: Participation + ] + + [Participation]o-[Participation] + [Enum]<:--[Participation] + + [ResultSharing | - +List<dynamic> toJson() + +index: int; + <static>+values: List<ResultSharing>; + <static>+public: ResultSharing; + <static>+private: ResultSharing; + <static>+organization: ResultSharing ] - [ChoiceQuestion + [ResultSharing]o-[ResultSharing] + [Enum]<:--[ResultSharing] + + [AppConfig | - <static>+questionType: String; - +multiple: bool; - +choices: List<Choice> + <static>+tableName: String; + +id: String; + +contact: Contact; + +appPrivacy: Map<String, String>; + +appTerms: Map<String, String>; + +designerPrivacy: Map<String, String>; + +designerTerms: Map<String, String>; + +imprint: Map<String, String>; + +analytics: StudyUAnalytics; + +primaryKeys: Map<String, dynamic> | +Map<String, dynamic> toJson(); - +Answer<List<String>> constructAnswer() + <static>+dynamic getAppConfig(); + <static>+dynamic getAppContact() ] - [<abstract>Question]<:-[ChoiceQuestion] + [AppConfig]o-[Contact] + [AppConfig]o-[StudyUAnalytics] + [<abstract>SupabaseObjectFunctions]<:-[AppConfig] - [Choice + [SubjectProgress | - +id: String; - +text: String + <static>+tableName: String; + +completedAt: DateTime?; + +subjectId: String; + +interventionId: String; + +taskId: String; + +resultType: String; + +result: Result<dynamic>; + +startedAt: DateTime?; + +primaryKeys: Map<String, dynamic>; + +hashCode: int | +Map<String, dynamic> toJson(); - +String toString() + +SubjectProgress setStartDateBackBy(); + +bool ==() ] - [<abstract>SliderQuestion + [SubjectProgress]o-[Result] + [<abstract>SupabaseObjectFunctions]<:-[SubjectProgress] + + [StudyInvite | - +minimum: double; - +maximum: double; - -_initial: double; - +step: double; - +initial: double + <static>+tableName: String; + +code: String; + +studyId: String; + +preselectedInterventionIds: List<String>?; + +primaryKeys: Map<String, dynamic> | - +Answer<num> constructAnswer() + +Map<String, dynamic> toJson() ] - [<abstract>Question]<:-[<abstract>SliderQuestion] + [<abstract>SupabaseObjectFunctions]<:-[StudyInvite] - [AnnotatedScaleQuestion + [StudyUUser | - <static>+questionType: String; - +annotations: List<Annotation> + <static>+tableName: String; + +id: String; + +email: String; + +preferences: Preferences; + +primaryKeys: Map<String, dynamic> | +Map<String, dynamic> toJson() ] - [<abstract>SliderQuestion]<:-[AnnotatedScaleQuestion] + [StudyUUser]o-[Preferences] + [<abstract>SupabaseObjectFunctions]<:-[StudyUUser] - [Annotation + [Preferences | - +value: int; - +annotation: String + +language: String; + +pinnedStudies: Set<String> | +Map<String, dynamic> toJson() ] - [ScaleQuestion + [Repo | - <static>+questionType: String; - +annotations: List<Annotation>; - +minColor: int?; - +maxColor: int?; - -_step: double; - +step: double; - +isAutostep: bool; - +autostep: int; - +annotationsSorted: List<Annotation>; - +minAnnotation: Annotation?; - +maxAnnotation: Annotation?; - +minLabel: String?; - +maxLabel: String?; - +midAnnotations: List<Annotation>; - +midLabels: List<String>; - +midValues: List<double>; - +values: List<double>; - +minimumAnnotation: String; - +maximumAnnotation: String; - +maximumColor: int; - +minimumColor: int + <static>+tableName: String; + +projectId: String; + +userId: String; + +studyId: String; + +provider: GitProvider; + +webUrl: String?; + +gitUrl: String?; + +primaryKeys: Map<String, dynamic> | - +Map<String, dynamic> toJson(); - +Annotation addAnnotation(); - -void _setAnnotationLabel(); - <static>+int getAutostepSize(); - <static>+List<int> generateMidValues() + +Map<String, dynamic> toJson() ] - [ScaleQuestion]o-[Annotation] - [<abstract>SliderQuestion]<:-[ScaleQuestion] - [AnnotatedScaleQuestion]<:--[ScaleQuestion] - [VisualAnalogueQuestion]<:--[ScaleQuestion] + [Repo]o-[GitProvider] + [<abstract>SupabaseObjectFunctions]<:-[Repo] - [VisualAnalogueQuestion - | - <static>+questionType: String; - +minimumColor: int; - +maximumColor: int; - +minimumAnnotation: String; - +maximumAnnotation: String + [GitProvider | - +Map<String, dynamic> toJson() + +index: int; + <static>+values: List<GitProvider>; + <static>+gitlab: GitProvider ] - [<abstract>SliderQuestion]<:-[VisualAnalogueQuestion] + [GitProvider]o-[GitProvider] + [Enum]<:--[GitProvider] - [BooleanQuestion + [StudySubject | - <static>+questionType: String + <static>+tableName: String; + -_controller: StreamController<StudySubject>; + +id: String; + +studyId: String; + +userId: String; + +startedAt: DateTime?; + +selectedInterventionIds: List<String>; + +inviteCode: String?; + +isDeleted: bool; + +study: Study; + +progress: List<SubjectProgress>; + +primaryKeys: Map<String, dynamic>; + +interventionOrder: List<String>; + +selectedInterventions: List<Intervention>; + +daysPerIntervention: int; + +minimumStudyLengthCompleted: bool; + +completedStudy: bool; + +onSave: Stream<StudySubject>; + +hashCode: int | +Map<String, dynamic> toJson(); - +Answer<bool> constructAnswer() + +dynamic addResult(); + +Map<DateTime, List<SubjectProgress>> getResultsByDate(); + +DateTime endDate(); + +int getDayOfStudyFor(); + +int getInterventionIndexForDate(); + +Intervention? getInterventionForDate(); + +List<Intervention> getInterventionsInOrder(); + +DateTime startOfPhase(); + +DateTime dayAfterEndOfPhase(); + +List<SubjectProgress> resultsFor(); + +int completedForPhase(); + +int daysLeftForPhase(); + +double percentCompletedForPhase(); + +double percentMissedForPhase(); + +List<SubjectProgress> getTaskProgressForDay(); + +bool completedTaskInstanceForDay(); + +bool completedTaskForDay(); + +int completedTasksFor(); + +bool allTasksCompletedFor(); + +int totalTaskCountFor(); + +List<TaskInstance> scheduleFor(); + +dynamic setStartDateBackBy(); + +dynamic save(); + +Map<String, dynamic> toFullJson(); + +dynamic deleteProgress(); + +dynamic delete(); + +dynamic softDelete(); + <static>+dynamic getStudyHistory(); + +bool ==(); + +String toString() ] - [<abstract>Question]<:-[BooleanQuestion] + [StudySubject]o-[StreamController] + [StudySubject]o-[Study] + [StudySubject]o-[Stream] + [<abstract>SupabaseObjectFunctions]<:-[StudySubject] - [<abstract>Question - | - <static>+questionTypes: Map<String, Question<dynamic> Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String; - +id: String; - +prompt: String?; - +rationale: String?; - <static>+keyConditional: String; - +conditional: QuestionConditional<V>? + [<abstract>InterventionTask | - +Map<String, dynamic> toJson(); - +bool shouldBeShown(); - +Answer<V>? getDefaultAnswer(); - +Type getAnswerType(); - +String toString() + <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> ] - [<abstract>Question]o-[QuestionConditional] + [<abstract>Task]<:-[<abstract>InterventionTask] - [EligibilityCriterion + [Intervention | +id: String; - +reason: String?; - +condition: Expression + +name: String?; + +description: String?; + +icon: String; + +tasks: List<InterventionTask> | +Map<String, dynamic> toJson(); - +bool isSatisfied(); - +bool isViolated() + +bool isBaseline() ] - [EligibilityCriterion]o-[<abstract>Expression] - - [QuestionnaireTask + [CheckmarkTask | - <static>+taskType: String; - +questions: StudyUQuestionnaire + <static>+taskType: String | +Map<String, dynamic> toJson(); +Map<DateTime, T> extractPropertyResults(); @@ -736,381 +791,301 @@ +String? getHumanReadablePropertyName() ] - [QuestionnaireTask]o-[StudyUQuestionnaire] - [<abstract>Observation]<:-[QuestionnaireTask] - - [<abstract>Observation - | - <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> - ] - - [<abstract>Task]<:-[<abstract>Observation] + [<abstract>InterventionTask]<:-[CheckmarkTask] - [StudySchedule + [Contact | - <static>+numberOfInterventions: int; - +numberOfCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +sequence: PhaseSequence; - +sequenceCustom: String; - +length: int; - +nameOfSequence: String + +organization: String; + +institutionalReviewBoard: String?; + +institutionalReviewBoardNumber: String?; + +researchers: String?; + +email: String; + +website: String; + +phone: String; + +additionalInfo: String? | +Map<String, dynamic> toJson(); - +int getNumberOfPhases(); - +List<int> generateWith(); - -int _nextIntervention(); - -List<int> _generateCycle(); - -List<int> _generateAlternatingCycle(); - -List<int> _generateCounterBalancedCycle(); - -List<int> _generateRandomizedCycle(); - -List<int> _generateCustomizedCycle(); - +String toString() - ] - - [StudySchedule]o-[PhaseSequence] - - [PhaseSequence - | - +index: int; - <static>+values: List<PhaseSequence>; - <static>+alternating: PhaseSequence; - <static>+counterBalanced: PhaseSequence; - <static>+randomized: PhaseSequence; - <static>+customized: PhaseSequence + +String toString() ] - [PhaseSequence]o-[PhaseSequence] - [Enum]<:--[PhaseSequence] - - + - + - - - - - - - - - - - - - - - - - + + + - + - - - - - + + + - + - - - + - + - + + + - + + + + - + + - + + + + - - - + + - + - + + + + + + + + + + + + + + + - + - - - + + + - + - - - + - + + + + + + + + + + + + + - + - - + + + + + + + + + + - + - + - + - + - + - - - + + - + + - + - + + + + + - + - + - + - + - + - - - + - - - - + - - + - + - - - - - + - - - - + - - + - + - + - + - - - + - + - - - - - + - + - + - + - - - + - + + + - - - - - - + - + + - + - - - + + - + + - + - - - + + - + + - - - - - - - - - - - + - - - + - - - - - - - - - - + + + + + + - + - + + + - + - + + + + + - + - - - - - + + + - + - + + + - + - + - - - - - - - - - - StudyResult - - - - - - <static>+studyResultTypes: Map<String, StudyResult Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String - +id: String - +filename: String - - - - - - +Map<String, dynamic> toJson() - +List<String> getHeaders() - +List<dynamic> getValues() - - - + + + + - - - - - - - - - NumericResult - - - - - - <static>+studyResultType: String - +resultProperty: DataReference<num> - - - - - - +Map<String, dynamic> toJson() - +List<String> getHeaders() - +List<dynamic> getValues() - - - + + + + + + + + + + + + + - - - + + + - + DataReference - + +task: String +property: String - + +Map<String, dynamic> toJson() +String toString() @@ -1119,184 +1094,213 @@ - - - - - + + + + + - - - InterventionResult + + + AverageSection - - - <static>+studyResultType: String + + + <static>+sectionType: String + +aggregate: TemporalAggregation? + +resultProperty: DataReference<num>? - - - +Map<String, dynamic> toJson() - +List<String> getHeaders() - +List<dynamic> getValues() + + + +Map<String, dynamic> toJson() - - - - + + + + - - - InterventionTask + + + TemporalAggregation - - - <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> + + + +index: int + <static>+values: List<TemporalAggregation> + <static>+day: TemporalAggregation + <static>+phase: TemporalAggregation + <static>+intervention: TemporalAggregation - - - - - + + + + + - - - Task + + + ReportSection - - - <static>+keyType: String - +type: String - +id: String - +title: String? - +header: String? - +footer: String? - +schedule: Schedule + + + <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)> + <static>+keyType: String + +type: String + +id: String + +title: String? + +description: String? - - - +Map<String, dynamic> toJson() - +String toString() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() + + + +Map<String, dynamic> toJson() + +String toString() - - - - - + + + + + - - - Intervention + + + LinearRegressionSection - - - +id: String - +name: String? - +description: String? - +icon: String - +tasks: List<InterventionTask> + + + <static>+sectionType: String + +resultProperty: DataReference<num>? + +alpha: double + +improvement: ImprovementDirection? - - - +Map<String, dynamic> toJson() - +bool isBaseline() + + + +Map<String, dynamic> toJson() - - - - - + + + + - - - CheckmarkTask + + + ImprovementDirection - - - <static>+taskType: String + + + +index: int + <static>+values: List<ImprovementDirection> + <static>+positive: ImprovementDirection + <static>+negative: ImprovementDirection - - - +Map<String, dynamic> toJson() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() + + + + + + + + Enum - - - - - + + + + + - - - ValueExpression + + + ReportSpecification - - - <static>+expressionType: String - +target: String? + + + +primary: ReportSection? + +secondary: List<ReportSection> - - - +bool checkValue() - +bool? evaluate() + + + +Map<String, dynamic> toJson() + +String toString() + + + + + + + + + + + + + NotExpression + + + + + + <static>+expressionType: String + +expression: Expression + + + + + + +Map<String, dynamic> toJson() + +bool? evaluate() - - - + + + - + Expression - + <static>+expressionTypes: Map<String, Expression Function(Map<String, dynamic>)> <static>+keyType: String @@ -1304,7 +1308,7 @@ - + +Map<String, dynamic> toJson() +String toString() @@ -1315,50 +1319,77 @@ - - - + + + - + BooleanExpression - + <static>+expressionType: String - - - +Map<String, dynamic> toJson() - +bool checkValue() + + + +Map<String, dynamic> toJson() + +bool checkValue() + + + + + + + + + + + + + ValueExpression + + + + + + <static>+expressionType: String + +target: String? + + + + + + +bool checkValue() + +bool? evaluate() - - - + + + - + ChoiceExpression - + <static>+expressionType: String +choices: Set<dynamic> - + +Map<String, dynamic> toJson() +bool checkValue() @@ -1366,529 +1397,522 @@ - - - - - + + + + + - - - NotExpression + + + StudyResult - - - <static>+expressionType: String - +expression: Expression + + + <static>+studyResultTypes: Map<String, StudyResult Function(Map<String, dynamic>)> + <static>+keyType: String + +type: String + +id: String + +filename: String - - - +Map<String, dynamic> toJson() - +bool? evaluate() + + + +Map<String, dynamic> toJson() + +List<String> getHeaders() + +List<dynamic> getValues() - - - - - - - - - StudyInvite - - + + + + + - - - <static>+tableName: String - +code: String - +studyId: String - +preselectedInterventionIds: List<String>? - +primaryKeys: Map<String, dynamic> + + + InterventionResult - - - +Map<String, dynamic> toJson() + + + <static>+studyResultType: String - - - - - - - - SupabaseObjectFunctions + + + +Map<String, dynamic> toJson() + +List<String> getHeaders() + +List<dynamic> getValues() - - - - - + + + + + - - - SubjectProgress + + + NumericResult - - - <static>+tableName: String - +completedAt: DateTime? - +subjectId: String - +interventionId: String - +taskId: String - +resultType: String - +result: Result<dynamic> - +startedAt: DateTime? - +primaryKeys: Map<String, dynamic> - +hashCode: int + + + <static>+studyResultType: String + +resultProperty: DataReference<num> - - - +Map<String, dynamic> toJson() - +SubjectProgress setStartDateBackBy() - +bool ==() + + + +Map<String, dynamic> toJson() + +List<String> getHeaders() + +List<dynamic> getValues() - - - - - + + + + + - - - Result + + + ConsentItem - - - <static>+keyType: String - +type: String - +periodId: String? - <static>+keyResult: String - +result: T + + + +id: String + +title: String? + +description: String? + +iconName: String - - - +Map<String, dynamic> toJson() - <static>-Result<dynamic> _fromJson() + + + +Map<String, dynamic> toJson() + +String toString() - - - - - + + + + + - - - StudySubject + + + QuestionConditional - - - <static>+tableName: String - -_controller: StreamController<StudySubject> - +id: String - +studyId: String - +userId: String - +startedAt: DateTime? - +selectedInterventionIds: List<String> - +inviteCode: String? - +isDeleted: bool - +study: Study - +progress: List<SubjectProgress> - +primaryKeys: Map<String, dynamic> - +interventionOrder: List<String> - +selectedInterventions: List<Intervention> - +daysPerIntervention: int - +minimumStudyLengthCompleted: bool - +completedStudy: bool - +onSave: Stream<StudySubject> - +hashCode: int + + + <static>+keyDefaultValue: String + +defaultValue: V? + +condition: Expression - - - +Map<String, dynamic> toJson() - +dynamic addResult() - +Map<DateTime, List<SubjectProgress>> getResultsByDate() - +DateTime endDate() - +int getDayOfStudyFor() - +int getInterventionIndexForDate() - +Intervention? getInterventionForDate() - +List<Intervention> getInterventionsInOrder() - +DateTime startOfPhase() - +DateTime dayAfterEndOfPhase() - +List<SubjectProgress> resultsFor() - +int completedForPhase() - +int daysLeftForPhase() - +double percentCompletedForPhase() - +double percentMissedForPhase() - +List<SubjectProgress> getTaskProgressForDay() - +bool completedTaskInstanceForDay() - +bool completedTaskForDay() - +int completedTasksFor() - +bool allTasksCompletedFor() - +int totalTaskCountFor() - +List<TaskInstance> scheduleFor() - +dynamic setStartDateBackBy() - +dynamic save() - +Map<String, dynamic> toFullJson() - +dynamic deleteProgress() - +dynamic delete() - +dynamic softDelete() - <static>+dynamic getStudyHistory() - +bool ==() - +String toString() + + + <static>-QuestionConditional<V> _fromJson() + +Map<String, dynamic> toJson() - - - + + + + + - - - StreamController + + + Question - - - - - - - - - - Study + + + <static>+questionTypes: Map<String, Question<dynamic> Function(Map<String, dynamic>)> + <static>+keyType: String + +type: String + +id: String + +prompt: String? + +rationale: String? + <static>+keyConditional: String + +conditional: QuestionConditional<V>? - - - <static>+tableName: String - <static>+baselineID: String - +id: String - +title: String? - +description: String? - +userId: String - +participation: Participation - +resultSharing: ResultSharing - +contact: Contact - +iconName: String - +published: bool - +questionnaire: StudyUQuestionnaire - +eligibilityCriteria: List<EligibilityCriterion> - +consent: List<ConsentItem> - +interventions: List<Intervention> - +observations: List<Observation> - +schedule: StudySchedule - +reportSpecification: ReportSpecification - +results: List<StudyResult> - +collaboratorEmails: List<String> - +registryPublished: bool - +participantCount: int - +endedCount: int - +activeSubjectCount: int - +missedDays: List<int> - +repo: Repo? - +invites: List<StudyInvite>? - +participants: List<StudySubject>? - +participantsProgress: List<SubjectProgress>? - +createdAt: DateTime? - +primaryKeys: Map<String, dynamic> - +hasEligibilityCheck: bool - +hasConsentCheck: bool - +totalMissedDays: int - +percentageMissedDays: double - +status: StudyStatus - +isDraft: bool - +isRunning: bool - +isClosed: bool + + + +Map<String, dynamic> toJson() + +bool shouldBeShown() + +Answer<V>? getDefaultAnswer() + +Type getAnswerType() + +String toString() - - - +Map<String, dynamic> toJson() - <static>+dynamic getResearcherDashboardStudies() - <static>+dynamic publishedPublicStudies() - +bool isOwner() - +bool isEditor() - +bool canEdit() - <static>+dynamic fetchResultsCSVTable() - +bool isReadonly() - +String toString() + + + + + + + + + + ChoiceQuestion - - - - + + + <static>+questionType: String + +multiple: bool + +choices: List<Choice> + + - - - Stream + + + +Map<String, dynamic> toJson() + +Answer<List<String>> constructAnswer() - - - - - + + + + + - - - AppConfig + + + Choice - - - <static>+tableName: String - +id: String - +contact: Contact - +appPrivacy: Map<String, String> - +appTerms: Map<String, String> - +designerPrivacy: Map<String, String> - +designerTerms: Map<String, String> - +imprint: Map<String, String> - +analytics: StudyUAnalytics - +primaryKeys: Map<String, dynamic> + + + +id: String + +text: String - - - +Map<String, dynamic> toJson() - <static>+dynamic getAppConfig() - <static>+dynamic getAppContact() + + + +Map<String, dynamic> toJson() + +String toString() - - - - - + + + + + - - - Contact + + + BooleanQuestion - - - +organization: String - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String - +website: String - +phone: String - +additionalInfo: String? + + + <static>+questionType: String - - - +Map<String, dynamic> toJson() - +String toString() + + + +Map<String, dynamic> toJson() + +Answer<bool> constructAnswer() - - - + + + + + - - - StudyUAnalytics + + + SliderQuestion + + + + + + +minimum: double + +maximum: double + -_initial: double + +step: double + +initial: double + + + + + + +Answer<num> constructAnswer() - - - - - + + + + + - - - Repo + + + ScaleQuestion - - - <static>+tableName: String - +projectId: String - +userId: String - +studyId: String - +provider: GitProvider - +webUrl: String - +gitUrl: String - +primaryKeys: Map<String, dynamic> + + + <static>+questionType: String + +annotations: List<Annotation> + +minColor: int? + +maxColor: int? + -_step: double + +step: double + +isAutostep: bool + +autostep: int + +annotationsSorted: List<Annotation> + +minAnnotation: Annotation? + +maxAnnotation: Annotation? + +minLabel: String? + +maxLabel: String? + +midAnnotations: List<Annotation> + +midLabels: List<String> + +midValues: List<double> + +values: List<double> + +minimumAnnotation: String + +maximumAnnotation: String + +maximumColor: int + +minimumColor: int - - - +Map<String, dynamic> toJson() + + + +Map<String, dynamic> toJson() + +Annotation addAnnotation() + -void _setAnnotationLabel() + <static>+int getAutostepSize() + <static>+List<int> generateMidValues() - - - - + + + + + - - - GitProvider + + + Annotation - - - +index: int - <static>+values: List<GitProvider> - <static>+gitlab: GitProvider + + + +value: int + +annotation: String + + + + + + +Map<String, dynamic> toJson() - - - + + + + + - - - Enum + + + AnnotatedScaleQuestion + + + + + + <static>+questionType: String + +annotations: List<Annotation> + + + + + + +Map<String, dynamic> toJson() - - - - + + + + + - - - Participation + + + VisualAnalogueQuestion - - - +index: int - <static>+values: List<Participation> - <static>+open: Participation - <static>+invite: Participation + + + <static>+questionType: String + +minimumColor: int + +maximumColor: int + +minimumAnnotation: String + +maximumAnnotation: String + + + + + + +Map<String, dynamic> toJson() - - - - + + + + + - - - ResultSharing + + + Answer - - - +index: int - <static>+values: List<ResultSharing> - <static>+public: ResultSharing - <static>+private: ResultSharing - <static>+organization: ResultSharing + + + +question: String + +timestamp: DateTime + <static>+keyResponse: String + +response: V + + + + + + +Map<String, dynamic> toJson() + <static>+Answer<dynamic> fromJson() + +String toString() - - - + + + - + StudyUQuestionnaire - - - +questions: List<Question<dynamic>> + + + +questions: List<Question<dynamic>> + + + + + + +List<dynamic> toJson() + + + + + + + + + + + + + EligibilityCriterion + + + + + + +id: String + +reason: String? + +condition: Expression - - - +List<dynamic> toJson() + + + +Map<String, dynamic> toJson() + +bool isSatisfied() + +bool isViolated() - - - + + + - + StudySchedule - + <static>+numberOfInterventions: int +numberOfCycles: int @@ -1901,7 +1925,7 @@ - + +Map<String, dynamic> toJson() +int getNumberOfPhases() @@ -1917,755 +1941,832 @@ - - - - - + + + + - - - ReportSpecification + + + PhaseSequence - - - +primary: ReportSection? - +secondary: List<ReportSection> + + + +index: int + <static>+values: List<PhaseSequence> + <static>+alternating: PhaseSequence + <static>+counterBalanced: PhaseSequence + <static>+randomized: PhaseSequence + <static>+customized: PhaseSequence - - - +Map<String, dynamic> toJson() - +String toString() + + + + + + + + + + QuestionnaireTask + + + + + + <static>+taskType: String + +questions: StudyUQuestionnaire + + + + + + +Map<String, dynamic> toJson() + +Map<DateTime, T> extractPropertyResults() + +Map<String, Type> getAvailableProperties() + +String? getHumanReadablePropertyName() - - - - + + + + - - - StudyStatus + + + Observation - - - +index: int - <static>+values: List<StudyStatus> - <static>+draft: StudyStatus - <static>+running: StudyStatus - <static>+closed: StudyStatus + + + <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> - - - - - + + + + + - - - LinearRegressionSection + + + Task - - - <static>+sectionType: String - +resultProperty: DataReference<num>? - +alpha: double - +improvement: ImprovementDirection? + + + <static>+keyType: String + +type: String + +id: String + +title: String? + +header: String? + +footer: String? + +schedule: Schedule - - - +Map<String, dynamic> toJson() + + + +Map<String, dynamic> toJson() + +String toString() + +Map<DateTime, T> extractPropertyResults() + +Map<String, Type> getAvailableProperties() + +String? getHumanReadablePropertyName() - - - - + + + + + - - - ImprovementDirection + + + Schedule - - - +index: int - <static>+values: List<ImprovementDirection> - <static>+positive: ImprovementDirection - <static>+negative: ImprovementDirection + + + +completionPeriods: List<CompletionPeriod> + +reminders: List<StudyUTimeOfDay> + + + + + + +Map<String, dynamic> toJson() + +String toString() - - - - - + + + + + - - - ReportSection + + + CompletionPeriod - - - <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String - +id: String - +title: String? - +description: String? + + + +id: String + +unlockTime: StudyUTimeOfDay + +lockTime: StudyUTimeOfDay - - - +Map<String, dynamic> toJson() - +String toString() + + + +Map<String, dynamic> toJson() + +String formatted() + +String toString() + +bool contains() - - - - - + + + + + - - - AverageSection + + + StudyUTimeOfDay - - - <static>+sectionType: String - +aggregate: TemporalAggregation? - +resultProperty: DataReference<num>? + + + +hour: int + +minute: int - - - +Map<String, dynamic> toJson() + + + +String toJson() + +String toString() + +bool earlierThan() - - - - + + + + + - - - TemporalAggregation + + + TaskInstance - - - +index: int - <static>+values: List<TemporalAggregation> - <static>+day: TemporalAggregation - <static>+phase: TemporalAggregation - <static>+intervention: TemporalAggregation + + + +task: Task + +id: String + +completionPeriod: CompletionPeriod + + + + + + <static>-Task _taskFromStudy() + <static>-Task _taskFromSubject() - - - - - + + + + + - - - ConsentItem + + + Result - - - +id: String - +title: String? - +description: String? - +iconName: String + + + <static>+keyType: String + +type: String + +periodId: String? + <static>+keyResult: String + +result: T + + + + + + +Map<String, dynamic> toJson() + <static>-Result<dynamic> _fromJson() + + + + + + + + + + + + + Study + + + + + + <static>+tableName: String + <static>+baselineID: String + +id: String + +title: String? + +description: String? + +userId: String + +participation: Participation + +resultSharing: ResultSharing + +contact: Contact + +iconName: String + +published: bool + +questionnaire: StudyUQuestionnaire + +eligibilityCriteria: List<EligibilityCriterion> + +consent: List<ConsentItem> + +interventions: List<Intervention> + +observations: List<Observation> + +schedule: StudySchedule + +reportSpecification: ReportSpecification + +results: List<StudyResult> + +collaboratorEmails: List<String> + +registryPublished: bool + +participantCount: int + +endedCount: int + +activeSubjectCount: int + +missedDays: List<int> + +repo: Repo? + +invites: List<StudyInvite>? + +participants: List<StudySubject>? + +participantsProgress: List<SubjectProgress>? + +createdAt: DateTime? + +primaryKeys: Map<String, dynamic> + +hasEligibilityCheck: bool + +hasConsentCheck: bool + +totalMissedDays: int + +percentageMissedDays: double + +status: StudyStatus + +isDraft: bool + +isRunning: bool + +isClosed: bool - - - +Map<String, dynamic> toJson() - +String toString() + + + +Map<String, dynamic> toJson() + <static>+dynamic getResearcherDashboardStudies() + <static>+dynamic publishedPublicStudies() + +bool isOwner() + +bool isEditor() + +bool canEdit() + <static>+dynamic fetchResultsCSVTable() + +bool isReadonly() + +String toString() + +int compareTo() - - - - - - - - - Schedule - - + + + + - - - +completionPeriods: List<CompletionPeriod> - +reminders: List<StudyUTimeOfDay> + + + Participation - - - +Map<String, dynamic> toJson() - +String toString() + + + +index: int + <static>+values: List<Participation> + <static>+open: Participation + <static>+invite: Participation - - - - - - - - - CompletionPeriod - - + + + + - - - +id: String - +unlockTime: StudyUTimeOfDay - +lockTime: StudyUTimeOfDay + + + ResultSharing - - - +Map<String, dynamic> toJson() - +String formatted() - +String toString() - +bool contains() + + + +index: int + <static>+values: List<ResultSharing> + <static>+public: ResultSharing + <static>+private: ResultSharing + <static>+organization: ResultSharing - - - - - + + + + + - - - StudyUTimeOfDay + + + Contact - - - +hour: int - +minute: int + + + +organization: String + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String + +website: String + +phone: String + +additionalInfo: String? - - - +String toJson() - +String toString() - +bool earlierThan() + + + +Map<String, dynamic> toJson() + +String toString() - - - - - + + + + + - - - TaskInstance + + + Repo - - - +task: Task - +id: String - +completionPeriod: CompletionPeriod + + + <static>+tableName: String + +projectId: String + +userId: String + +studyId: String + +provider: GitProvider + +webUrl: String? + +gitUrl: String? + +primaryKeys: Map<String, dynamic> - - - <static>-Task _taskFromStudy() - <static>-Task _taskFromSubject() + + + +Map<String, dynamic> toJson() - - - - - - - - - Answer - - + + + + - - - +question: String - +timestamp: DateTime - <static>+keyResponse: String - +response: V + + + StudyStatus - - - +Map<String, dynamic> toJson() - <static>+Answer<dynamic> fromJson() - +String toString() + + + +index: int + <static>+values: List<StudyStatus> + <static>+draft: StudyStatus + <static>+running: StudyStatus + <static>+closed: StudyStatus - - - - - + + + - - - QuestionConditional + + + SupabaseObjectFunctions - - - <static>+keyDefaultValue: String - +defaultValue: V? - +condition: Expression - - + + + + - - - <static>-QuestionConditional<V> _fromJson() - +Map<String, dynamic> toJson() + + + Comparable - - - - - + + + + + - - - ChoiceQuestion + + + AppConfig - - - <static>+questionType: String - +multiple: bool - +choices: List<Choice> + + + <static>+tableName: String + +id: String + +contact: Contact + +appPrivacy: Map<String, String> + +appTerms: Map<String, String> + +designerPrivacy: Map<String, String> + +designerTerms: Map<String, String> + +imprint: Map<String, String> + +analytics: StudyUAnalytics + +primaryKeys: Map<String, dynamic> - - - +Map<String, dynamic> toJson() - +Answer<List<String>> constructAnswer() + + + +Map<String, dynamic> toJson() + <static>+dynamic getAppConfig() + <static>+dynamic getAppContact() - - - - - - - - - Question - - - - - - <static>+questionTypes: Map<String, Question<dynamic> Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String - +id: String - +prompt: String? - +rationale: String? - <static>+keyConditional: String - +conditional: QuestionConditional<V>? - - + + + - - - +Map<String, dynamic> toJson() - +bool shouldBeShown() - +Answer<V>? getDefaultAnswer() - +Type getAnswerType() - +String toString() + + + StudyUAnalytics - - - - - + + + + + - - - Choice + + + SubjectProgress - - - +id: String - +text: String + + + <static>+tableName: String + +completedAt: DateTime? + +subjectId: String + +interventionId: String + +taskId: String + +resultType: String + +result: Result<dynamic> + +startedAt: DateTime? + +primaryKeys: Map<String, dynamic> + +hashCode: int - - - +Map<String, dynamic> toJson() - +String toString() + + + +Map<String, dynamic> toJson() + +SubjectProgress setStartDateBackBy() + +bool ==() - - - - - + + + + + - - - SliderQuestion + + + StudyInvite - - - +minimum: double - +maximum: double - -_initial: double - +step: double - +initial: double + + + <static>+tableName: String + +code: String + +studyId: String + +preselectedInterventionIds: List<String>? + +primaryKeys: Map<String, dynamic> - - - +Answer<num> constructAnswer() + + + +Map<String, dynamic> toJson() - - - - - + + + + + - - - AnnotatedScaleQuestion + + + StudyUUser - - - <static>+questionType: String - +annotations: List<Annotation> + + + <static>+tableName: String + +id: String + +email: String + +preferences: Preferences + +primaryKeys: Map<String, dynamic> - - - +Map<String, dynamic> toJson() + + + +Map<String, dynamic> toJson() - - - - - + + + + + - - - Annotation + + + Preferences - - - +value: int - +annotation: String + + + +language: String + +pinnedStudies: Set<String> - - - +Map<String, dynamic> toJson() + + + +Map<String, dynamic> toJson() - - - - - - - - - ScaleQuestion - - + + + + - - - <static>+questionType: String - +annotations: List<Annotation> - +minColor: int? - +maxColor: int? - -_step: double - +step: double - +isAutostep: bool - +autostep: int - +annotationsSorted: List<Annotation> - +minAnnotation: Annotation? - +maxAnnotation: Annotation? - +minLabel: String? - +maxLabel: String? - +midAnnotations: List<Annotation> - +midLabels: List<String> - +midValues: List<double> - +values: List<double> - +minimumAnnotation: String - +maximumAnnotation: String - +maximumColor: int - +minimumColor: int + + + GitProvider - - - +Map<String, dynamic> toJson() - +Annotation addAnnotation() - -void _setAnnotationLabel() - <static>+int getAutostepSize() - <static>+List<int> generateMidValues() + + + +index: int + <static>+values: List<GitProvider> + <static>+gitlab: GitProvider - - - - - + + + + + - - - VisualAnalogueQuestion + + + StudySubject - - - <static>+questionType: String - +minimumColor: int - +maximumColor: int - +minimumAnnotation: String - +maximumAnnotation: String + + + <static>+tableName: String + -_controller: StreamController<StudySubject> + +id: String + +studyId: String + +userId: String + +startedAt: DateTime? + +selectedInterventionIds: List<String> + +inviteCode: String? + +isDeleted: bool + +study: Study + +progress: List<SubjectProgress> + +primaryKeys: Map<String, dynamic> + +interventionOrder: List<String> + +selectedInterventions: List<Intervention> + +daysPerIntervention: int + +minimumStudyLengthCompleted: bool + +completedStudy: bool + +onSave: Stream<StudySubject> + +hashCode: int - - - +Map<String, dynamic> toJson() + + + +Map<String, dynamic> toJson() + +dynamic addResult() + +Map<DateTime, List<SubjectProgress>> getResultsByDate() + +DateTime endDate() + +int getDayOfStudyFor() + +int getInterventionIndexForDate() + +Intervention? getInterventionForDate() + +List<Intervention> getInterventionsInOrder() + +DateTime startOfPhase() + +DateTime dayAfterEndOfPhase() + +List<SubjectProgress> resultsFor() + +int completedForPhase() + +int daysLeftForPhase() + +double percentCompletedForPhase() + +double percentMissedForPhase() + +List<SubjectProgress> getTaskProgressForDay() + +bool completedTaskInstanceForDay() + +bool completedTaskForDay() + +int completedTasksFor() + +bool allTasksCompletedFor() + +int totalTaskCountFor() + +List<TaskInstance> scheduleFor() + +dynamic setStartDateBackBy() + +dynamic save() + +Map<String, dynamic> toFullJson() + +dynamic deleteProgress() + +dynamic delete() + +dynamic softDelete() + <static>+dynamic getStudyHistory() + +bool ==() + +String toString() - - - - - + + + - - - BooleanQuestion + + + StreamController - - - <static>+questionType: String - - + + + + - - - +Map<String, dynamic> toJson() - +Answer<bool> constructAnswer() + + + Stream - - - - - - - - - EligibilityCriterion - - + + + + - - - +id: String - +reason: String? - +condition: Expression + + + InterventionTask - - - +Map<String, dynamic> toJson() - +bool isSatisfied() - +bool isViolated() + + + <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> - - - - - + + + + + - - - QuestionnaireTask + + + Intervention - - - <static>+taskType: String - +questions: StudyUQuestionnaire + + + +id: String + +name: String? + +description: String? + +icon: String + +tasks: List<InterventionTask> - - - +Map<String, dynamic> toJson() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() + + + +Map<String, dynamic> toJson() + +bool isBaseline() - - - - - - - - Observation - - + + + + + - - - <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> + + + CheckmarkTask - - - - - - - - - PhaseSequence + + + <static>+taskType: String - - - +index: int - <static>+values: List<PhaseSequence> - <static>+alternating: PhaseSequence - <static>+counterBalanced: PhaseSequence - <static>+randomized: PhaseSequence - <static>+customized: PhaseSequence + + + +Map<String, dynamic> toJson() + +Map<DateTime, T> extractPropertyResults() + +Map<String, Type> getAvailableProperties() + +String? getHumanReadablePropertyName() diff --git a/docs/uml/core/lib/src/uml.svg b/docs/uml/core/lib/src/uml.svg index dba4d6ea2..2e673cef6 100644 --- a/docs/uml/core/lib/src/uml.svg +++ b/docs/uml/core/lib/src/uml.svg @@ -1,134 +1,99 @@ - - [<abstract>SupabaseObject + + [DataReference | - +primaryKeys: Map<String, dynamic> - | - +Map<String, dynamic> toJson() - ] - - [<abstract>SupabaseObjectFunctions - | - <static>+T fromJson(); - +dynamic delete(); - +dynamic save() - ] - - [<abstract>SupabaseObject]<:--[<abstract>SupabaseObjectFunctions] - - [SupabaseQuery - | - <static>+dynamic getAll(); - <static>+dynamic getById(); - <static>+dynamic batchUpsert(); - <static>+List<T> extractSupabaseList(); - <static>+T extractSupabaseSingleRow(); - <static>+void catchSupabaseException() - ] - - [Analytics - | - <static>+logger: Logger; - <static>+onLog: StreamSubscription<LogRecord> + +task: String; + +property: String | - <static>+void init(); - <static>+void dispose(); - <static>+dynamic captureEvent(); - <static>+dynamic captureException(); - <static>+dynamic captureMessage(); - <static>+void addBreadcrumb() + +Map<String, dynamic> toJson(); + +String toString(); + +Map<DateTime, T> retrieveFromResults() ] - [Analytics]o-[Logger] - [Analytics]o-[StreamSubscription] - - [StudyUAnalytics + [AverageSection | - +enabled: bool; - +dsn: String; - +samplingRate: double?; - <static>+keyStudyUAnalytics: String + <static>+sectionType: String; + +aggregate: TemporalAggregation?; + +resultProperty: DataReference<num>? | +Map<String, dynamic> toJson() ] - [<abstract>StudyResult - | - <static>+studyResultTypes: Map<String, StudyResult Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String; - +id: String; - +filename: String - | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() - ] + [AverageSection]o-[TemporalAggregation] + [AverageSection]o-[DataReference] + [<abstract>ReportSection]<:-[AverageSection] - [NumericResult + [LinearRegressionSection | - <static>+studyResultType: String; - +resultProperty: DataReference<num> + <static>+sectionType: String; + +resultProperty: DataReference<num>?; + +alpha: double; + +improvement: ImprovementDirection? | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() + +Map<String, dynamic> toJson() ] - [NumericResult]o-[DataReference] - [<abstract>StudyResult]<:-[NumericResult] + [LinearRegressionSection]o-[DataReference] + [LinearRegressionSection]o-[ImprovementDirection] + [<abstract>ReportSection]<:-[LinearRegressionSection] - [InterventionResult - | - <static>+studyResultType: String + [ImprovementDirection | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() + +index: int; + <static>+values: List<ImprovementDirection>; + <static>+positive: ImprovementDirection; + <static>+negative: ImprovementDirection ] - [<abstract>StudyResult]<:-[InterventionResult] + [ImprovementDirection]o-[ImprovementDirection] + [Enum]<:--[ImprovementDirection] - [<abstract>InterventionTask + [TemporalAggregation | - <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> + +index: int; + <static>+values: List<TemporalAggregation>; + <static>+day: TemporalAggregation; + <static>+phase: TemporalAggregation; + <static>+intervention: TemporalAggregation ] - [<abstract>Task]<:-[<abstract>InterventionTask] + [TemporalAggregation]o-[TemporalAggregation] + [Enum]<:--[TemporalAggregation] - [Intervention + [ReportSpecification | - +id: String; - +name: String?; - +description: String?; - +icon: String; - +tasks: List<InterventionTask> + +primary: ReportSection?; + +secondary: List<ReportSection> | +Map<String, dynamic> toJson(); - +bool isBaseline() + +String toString() ] - [CheckmarkTask + [ReportSpecification]o-[<abstract>ReportSection] + + [<abstract>ReportSection | - <static>+taskType: String + <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)>; + <static>+keyType: String; + +type: String; + +id: String; + +title: String?; + +description: String? | +Map<String, dynamic> toJson(); - +Map<DateTime, T> extractPropertyResults(); - +Map<String, Type> getAvailableProperties(); - +String? getHumanReadablePropertyName() + +String toString() ] - [<abstract>InterventionTask]<:-[CheckmarkTask] - - [<abstract>ValueExpression + [NotExpression | <static>+expressionType: String; - +target: String? + +expression: Expression | - +bool checkValue(); + +Map<String, dynamic> toJson(); +bool? evaluate() ] - [<abstract>Expression]<:-[<abstract>ValueExpression] + [NotExpression]o-[<abstract>Expression] + [<abstract>Expression]<:-[NotExpression] [BooleanExpression | @@ -140,28 +105,27 @@ [<abstract>ValueExpression]<:-[BooleanExpression] - [ChoiceExpression + [<abstract>ValueExpression | <static>+expressionType: String; - +choices: Set<dynamic> + +target: String? | - +Map<String, dynamic> toJson(); - +bool checkValue() + +bool checkValue(); + +bool? evaluate() ] - [<abstract>ValueExpression]<:-[ChoiceExpression] + [<abstract>Expression]<:-[<abstract>ValueExpression] - [NotExpression + [ChoiceExpression | <static>+expressionType: String; - +expression: Expression + +choices: Set<dynamic> | +Map<String, dynamic> toJson(); - +bool? evaluate() + +bool checkValue() ] - [NotExpression]o-[<abstract>Expression] - [<abstract>Expression]<:-[NotExpression] + [<abstract>ValueExpression]<:-[ChoiceExpression] [<abstract>Expression | @@ -174,354 +138,288 @@ +bool? evaluate() ] - [DataReference + [<abstract>StudyResult | - +task: String; - +property: String + <static>+studyResultTypes: Map<String, StudyResult Function(Map<String, dynamic>)>; + <static>+keyType: String; + +type: String; + +id: String; + +filename: String | +Map<String, dynamic> toJson(); - +String toString(); - +Map<DateTime, T> retrieveFromResults() + +List<String> getHeaders(); + +List<dynamic> getValues() ] - [StudyInvite + [InterventionResult | - <static>+tableName: String; - +code: String; - +studyId: String; - +preselectedInterventionIds: List<String>?; - +primaryKeys: Map<String, dynamic> + <static>+studyResultType: String | - +Map<String, dynamic> toJson() + +Map<String, dynamic> toJson(); + +List<String> getHeaders(); + +List<dynamic> getValues() ] - [<abstract>SupabaseObjectFunctions]<:-[StudyInvite] + [<abstract>StudyResult]<:-[InterventionResult] - [SubjectProgress + [NumericResult | - <static>+tableName: String; - +completedAt: DateTime?; - +subjectId: String; - +interventionId: String; - +taskId: String; - +resultType: String; - +result: Result<dynamic>; - +startedAt: DateTime?; - +primaryKeys: Map<String, dynamic>; - +hashCode: int + <static>+studyResultType: String; + +resultProperty: DataReference<num> | +Map<String, dynamic> toJson(); - +SubjectProgress setStartDateBackBy(); - +bool ==() + +List<String> getHeaders(); + +List<dynamic> getValues() ] - [SubjectProgress]o-[Result] - [<abstract>SupabaseObjectFunctions]<:-[SubjectProgress] + [NumericResult]o-[DataReference] + [<abstract>StudyResult]<:-[NumericResult] - [StudySubject + [ConsentItem | - <static>+tableName: String; - -_controller: StreamController<StudySubject>; +id: String; - +studyId: String; - +userId: String; - +startedAt: DateTime?; - +selectedInterventionIds: List<String>; - +inviteCode: String?; - +isDeleted: bool; - +study: Study; - +progress: List<SubjectProgress>; - +primaryKeys: Map<String, dynamic>; - +interventionOrder: List<String>; - +selectedInterventions: List<Intervention>; - +daysPerIntervention: int; - +minimumStudyLengthCompleted: bool; - +completedStudy: bool; - +onSave: Stream<StudySubject>; - +hashCode: int + +title: String?; + +description: String?; + +iconName: String | +Map<String, dynamic> toJson(); - +dynamic addResult(); - +Map<DateTime, List<SubjectProgress>> getResultsByDate(); - +DateTime endDate(); - +int getDayOfStudyFor(); - +int getInterventionIndexForDate(); - +Intervention? getInterventionForDate(); - +List<Intervention> getInterventionsInOrder(); - +DateTime startOfPhase(); - +DateTime dayAfterEndOfPhase(); - +List<SubjectProgress> resultsFor(); - +int completedForPhase(); - +int daysLeftForPhase(); - +double percentCompletedForPhase(); - +double percentMissedForPhase(); - +List<SubjectProgress> getTaskProgressForDay(); - +bool completedTaskInstanceForDay(); - +bool completedTaskForDay(); - +int completedTasksFor(); - +bool allTasksCompletedFor(); - +int totalTaskCountFor(); - +List<TaskInstance> scheduleFor(); - +dynamic setStartDateBackBy(); - +dynamic save(); - +Map<String, dynamic> toFullJson(); - +dynamic deleteProgress(); - +dynamic delete(); - +dynamic softDelete(); - <static>+dynamic getStudyHistory(); - +bool ==(); +String toString() ] - [StudySubject]o-[StreamController] - [StudySubject]o-[Study] - [StudySubject]o-[Stream] - [<abstract>SupabaseObjectFunctions]<:-[StudySubject] - - [AppConfig + [QuestionConditional | - <static>+tableName: String; - +id: String; - +contact: Contact; - +appPrivacy: Map<String, String>; - +appTerms: Map<String, String>; - +designerPrivacy: Map<String, String>; - +designerTerms: Map<String, String>; - +imprint: Map<String, String>; - +analytics: StudyUAnalytics; - +primaryKeys: Map<String, dynamic> + <static>+keyDefaultValue: String; + +defaultValue: V?; + +condition: Expression | - +Map<String, dynamic> toJson(); - <static>+dynamic getAppConfig(); - <static>+dynamic getAppContact() + <static>-QuestionConditional<V> _fromJson(); + +Map<String, dynamic> toJson() ] - [AppConfig]o-[Contact] - [AppConfig]o-[StudyUAnalytics] - [<abstract>SupabaseObjectFunctions]<:-[AppConfig] + [QuestionConditional]o-[<abstract>Expression] - [Repo + [<abstract>Question | - <static>+tableName: String; - +projectId: String; - +userId: String; - +studyId: String; - +provider: GitProvider; - +webUrl: String; - +gitUrl: String; - +primaryKeys: Map<String, dynamic> + <static>+questionTypes: Map<String, Question<dynamic> Function(Map<String, dynamic>)>; + <static>+keyType: String; + +type: String; + +id: String; + +prompt: String?; + +rationale: String?; + <static>+keyConditional: String; + +conditional: QuestionConditional<V>? | - +Map<String, dynamic> toJson() + +Map<String, dynamic> toJson(); + +bool shouldBeShown(); + +Answer<V>? getDefaultAnswer(); + +Type getAnswerType(); + +String toString() ] - [Repo]o-[GitProvider] - [<abstract>SupabaseObjectFunctions]<:-[Repo] + [<abstract>Question]o-[QuestionConditional] - [GitProvider + [ChoiceQuestion | - +index: int; - <static>+values: List<GitProvider>; - <static>+gitlab: GitProvider + <static>+questionType: String; + +multiple: bool; + +choices: List<Choice> + | + +Map<String, dynamic> toJson(); + +Answer<List<String>> constructAnswer() ] - [GitProvider]o-[GitProvider] - [Enum]<:--[GitProvider] + [<abstract>Question]<:-[ChoiceQuestion] - [Study + [Choice | - <static>+tableName: String; - <static>+baselineID: String; +id: String; - +title: String?; - +description: String?; - +userId: String; - +participation: Participation; - +resultSharing: ResultSharing; - +contact: Contact; - +iconName: String; - +published: bool; - +questionnaire: StudyUQuestionnaire; - +eligibilityCriteria: List<EligibilityCriterion>; - +consent: List<ConsentItem>; - +interventions: List<Intervention>; - +observations: List<Observation>; - +schedule: StudySchedule; - +reportSpecification: ReportSpecification; - +results: List<StudyResult>; - +collaboratorEmails: List<String>; - +registryPublished: bool; - +participantCount: int; - +endedCount: int; - +activeSubjectCount: int; - +missedDays: List<int>; - +repo: Repo?; - +invites: List<StudyInvite>?; - +participants: List<StudySubject>?; - +participantsProgress: List<SubjectProgress>?; - +createdAt: DateTime?; - +primaryKeys: Map<String, dynamic>; - +hasEligibilityCheck: bool; - +hasConsentCheck: bool; - +totalMissedDays: int; - +percentageMissedDays: double; - +status: StudyStatus; - +isDraft: bool; - +isRunning: bool; - +isClosed: bool + +text: String | +Map<String, dynamic> toJson(); - <static>+dynamic getResearcherDashboardStudies(); - <static>+dynamic publishedPublicStudies(); - +bool isOwner(); - +bool isEditor(); - +bool canEdit(); - <static>+dynamic fetchResultsCSVTable(); - +bool isReadonly(); +String toString() ] - [Study]o-[Participation] - [Study]o-[ResultSharing] - [Study]o-[Contact] - [Study]o-[StudyUQuestionnaire] - [Study]o-[StudySchedule] - [Study]o-[ReportSpecification] - [Study]o-[Repo] - [Study]o-[StudyStatus] - [<abstract>SupabaseObjectFunctions]<:-[Study] - - [StudyStatus + [BooleanQuestion | - +index: int; - <static>+values: List<StudyStatus>; - <static>+draft: StudyStatus; - <static>+running: StudyStatus; - <static>+closed: StudyStatus - ] - - [StudyStatus]o-[StudyStatus] - [Enum]<:--[StudyStatus] - - [Participation + <static>+questionType: String | - +index: int; - <static>+values: List<Participation>; - <static>+open: Participation; - <static>+invite: Participation + +Map<String, dynamic> toJson(); + +Answer<bool> constructAnswer() ] - [Participation]o-[Participation] - [Enum]<:--[Participation] + [<abstract>Question]<:-[BooleanQuestion] - [ResultSharing + [<abstract>SliderQuestion | - +index: int; - <static>+values: List<ResultSharing>; - <static>+public: ResultSharing; - <static>+private: ResultSharing; - <static>+organization: ResultSharing + +minimum: double; + +maximum: double; + -_initial: double; + +step: double; + +initial: double + | + +Answer<num> constructAnswer() ] - [ResultSharing]o-[ResultSharing] - [Enum]<:--[ResultSharing] + [<abstract>Question]<:-[<abstract>SliderQuestion] - [LinearRegressionSection + [ScaleQuestion | - <static>+sectionType: String; - +resultProperty: DataReference<num>?; - +alpha: double; - +improvement: ImprovementDirection? + <static>+questionType: String; + +annotations: List<Annotation>; + +minColor: int?; + +maxColor: int?; + -_step: double; + +step: double; + +isAutostep: bool; + +autostep: int; + +annotationsSorted: List<Annotation>; + +minAnnotation: Annotation?; + +maxAnnotation: Annotation?; + +minLabel: String?; + +maxLabel: String?; + +midAnnotations: List<Annotation>; + +midLabels: List<String>; + +midValues: List<double>; + +values: List<double>; + +minimumAnnotation: String; + +maximumAnnotation: String; + +maximumColor: int; + +minimumColor: int | - +Map<String, dynamic> toJson() + +Map<String, dynamic> toJson(); + +Annotation addAnnotation(); + -void _setAnnotationLabel(); + <static>+int getAutostepSize(); + <static>+List<int> generateMidValues() ] - [LinearRegressionSection]o-[DataReference] - [LinearRegressionSection]o-[ImprovementDirection] - [<abstract>ReportSection]<:-[LinearRegressionSection] + [ScaleQuestion]o-[Annotation] + [<abstract>SliderQuestion]<:-[ScaleQuestion] + [AnnotatedScaleQuestion]<:--[ScaleQuestion] + [VisualAnalogueQuestion]<:--[ScaleQuestion] - [ImprovementDirection + [AnnotatedScaleQuestion | - +index: int; - <static>+values: List<ImprovementDirection>; - <static>+positive: ImprovementDirection; - <static>+negative: ImprovementDirection + <static>+questionType: String; + +annotations: List<Annotation> + | + +Map<String, dynamic> toJson() ] - [ImprovementDirection]o-[ImprovementDirection] - [Enum]<:--[ImprovementDirection] + [<abstract>SliderQuestion]<:-[AnnotatedScaleQuestion] - [AverageSection + [Annotation | - <static>+sectionType: String; - +aggregate: TemporalAggregation?; - +resultProperty: DataReference<num>? + +value: int; + +annotation: String | +Map<String, dynamic> toJson() ] - [AverageSection]o-[TemporalAggregation] - [AverageSection]o-[DataReference] - [<abstract>ReportSection]<:-[AverageSection] - - [TemporalAggregation + [VisualAnalogueQuestion | - +index: int; - <static>+values: List<TemporalAggregation>; - <static>+day: TemporalAggregation; - <static>+phase: TemporalAggregation; - <static>+intervention: TemporalAggregation + <static>+questionType: String; + +minimumColor: int; + +maximumColor: int; + +minimumAnnotation: String; + +maximumAnnotation: String + | + +Map<String, dynamic> toJson() ] - [TemporalAggregation]o-[TemporalAggregation] - [Enum]<:--[TemporalAggregation] + [<abstract>SliderQuestion]<:-[VisualAnalogueQuestion] - [ReportSpecification + [Answer | - +primary: ReportSection?; - +secondary: List<ReportSection> + +question: String; + +timestamp: DateTime; + <static>+keyResponse: String; + +response: V | +Map<String, dynamic> toJson(); + <static>+Answer<dynamic> fromJson(); +String toString() ] - [ReportSpecification]o-[<abstract>ReportSection] + [StudyUQuestionnaire + | + +questions: List<Question<dynamic>> + | + +List<dynamic> toJson() + ] - [<abstract>ReportSection + [EligibilityCriterion | - <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String; +id: String; - +title: String?; - +description: String? + +reason: String?; + +condition: Expression | +Map<String, dynamic> toJson(); - +String toString() + +bool isSatisfied(); + +bool isViolated() ] - [ConsentItem + [EligibilityCriterion]o-[<abstract>Expression] + + [StudySchedule | - +id: String; - +title: String?; - +description: String?; - +iconName: String + <static>+numberOfInterventions: int; + +numberOfCycles: int; + +phaseDuration: int; + +includeBaseline: bool; + +sequence: PhaseSequence; + +sequenceCustom: String; + +length: int; + +nameOfSequence: String | +Map<String, dynamic> toJson(); + +int getNumberOfPhases(); + +List<int> generateWith(); + -int _nextIntervention(); + -List<int> _generateCycle(); + -List<int> _generateAlternatingCycle(); + -List<int> _generateCounterBalancedCycle(); + -List<int> _generateRandomizedCycle(); + -List<int> _generateCustomizedCycle(); +String toString() ] - [Result + [StudySchedule]o-[PhaseSequence] + + [PhaseSequence | - <static>+keyType: String; - +type: String; - +periodId: String?; - <static>+keyResult: String; - +result: T + +index: int; + <static>+values: List<PhaseSequence>; + <static>+alternating: PhaseSequence; + <static>+counterBalanced: PhaseSequence; + <static>+randomized: PhaseSequence; + <static>+customized: PhaseSequence + ] + + [PhaseSequence]o-[PhaseSequence] + [Enum]<:--[PhaseSequence] + + [QuestionnaireTask + | + <static>+taskType: String; + +questions: StudyUQuestionnaire | +Map<String, dynamic> toJson(); - <static>-Result<dynamic> _fromJson() + +Map<DateTime, T> extractPropertyResults(); + +Map<String, Type> getAvailableProperties(); + +String? getHumanReadablePropertyName() + ] + + [QuestionnaireTask]o-[StudyUQuestionnaire] + [<abstract>Observation]<:-[QuestionnaireTask] + + [<abstract>Observation + | + <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> ] + [<abstract>Task]<:-[<abstract>Observation] + [Schedule | +completionPeriods: List<CompletionPeriod>; @@ -587,677 +485,995 @@ [<abstract>Task]o-[Schedule] - [Contact + [Result | - +organization: String; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String; - +website: String; - +phone: String; - +additionalInfo: String? + <static>+keyType: String; + +type: String; + +periodId: String?; + <static>+keyResult: String; + +result: T | +Map<String, dynamic> toJson(); - +String toString() + <static>-Result<dynamic> _fromJson() ] - [Answer + [Study | - +question: String; - +timestamp: DateTime; - <static>+keyResponse: String; - +response: V + <static>+tableName: String; + <static>+baselineID: String; + +id: String; + +title: String?; + +description: String?; + +userId: String; + +participation: Participation; + +resultSharing: ResultSharing; + +contact: Contact; + +iconName: String; + +published: bool; + +questionnaire: StudyUQuestionnaire; + +eligibilityCriteria: List<EligibilityCriterion>; + +consent: List<ConsentItem>; + +interventions: List<Intervention>; + +observations: List<Observation>; + +schedule: StudySchedule; + +reportSpecification: ReportSpecification; + +results: List<StudyResult>; + +collaboratorEmails: List<String>; + +registryPublished: bool; + +participantCount: int; + +endedCount: int; + +activeSubjectCount: int; + +missedDays: List<int>; + +repo: Repo?; + +invites: List<StudyInvite>?; + +participants: List<StudySubject>?; + +participantsProgress: List<SubjectProgress>?; + +createdAt: DateTime?; + +primaryKeys: Map<String, dynamic>; + +hasEligibilityCheck: bool; + +hasConsentCheck: bool; + +totalMissedDays: int; + +percentageMissedDays: double; + +status: StudyStatus; + +isDraft: bool; + +isRunning: bool; + +isClosed: bool | +Map<String, dynamic> toJson(); - <static>+Answer<dynamic> fromJson(); - +String toString() + <static>+dynamic getResearcherDashboardStudies(); + <static>+dynamic publishedPublicStudies(); + +bool isOwner(); + +bool isEditor(); + +bool canEdit(); + <static>+dynamic fetchResultsCSVTable(); + +bool isReadonly(); + +String toString(); + +int compareTo() ] - [QuestionConditional + [Study]o-[Participation] + [Study]o-[ResultSharing] + [Study]o-[Contact] + [Study]o-[StudyUQuestionnaire] + [Study]o-[StudySchedule] + [Study]o-[ReportSpecification] + [Study]o-[Repo] + [Study]o-[StudyStatus] + [<abstract>SupabaseObjectFunctions]<:-[Study] + [Comparable]<:--[Study] + + [StudyStatus + | + +index: int; + <static>+values: List<StudyStatus>; + <static>+draft: StudyStatus; + <static>+running: StudyStatus; + <static>+closed: StudyStatus + ] + + [StudyStatus]o-[StudyStatus] + [Enum]<:--[StudyStatus] + + [Participation + | + +index: int; + <static>+values: List<Participation>; + <static>+open: Participation; + <static>+invite: Participation + ] + + [Participation]o-[Participation] + [Enum]<:--[Participation] + + [ResultSharing + | + +index: int; + <static>+values: List<ResultSharing>; + <static>+public: ResultSharing; + <static>+private: ResultSharing; + <static>+organization: ResultSharing + ] + + [ResultSharing]o-[ResultSharing] + [Enum]<:--[ResultSharing] + + [AppConfig | - <static>+keyDefaultValue: String; - +defaultValue: V?; - +condition: Expression + <static>+tableName: String; + +id: String; + +contact: Contact; + +appPrivacy: Map<String, String>; + +appTerms: Map<String, String>; + +designerPrivacy: Map<String, String>; + +designerTerms: Map<String, String>; + +imprint: Map<String, String>; + +analytics: StudyUAnalytics; + +primaryKeys: Map<String, dynamic> | - <static>-QuestionConditional<V> _fromJson(); - +Map<String, dynamic> toJson() + +Map<String, dynamic> toJson(); + <static>+dynamic getAppConfig(); + <static>+dynamic getAppContact() ] - [QuestionConditional]o-[<abstract>Expression] + [AppConfig]o-[Contact] + [AppConfig]o-[StudyUAnalytics] + [<abstract>SupabaseObjectFunctions]<:-[AppConfig] - [StudyUQuestionnaire + [SubjectProgress | - +questions: List<Question<dynamic>> + <static>+tableName: String; + +completedAt: DateTime?; + +subjectId: String; + +interventionId: String; + +taskId: String; + +resultType: String; + +result: Result<dynamic>; + +startedAt: DateTime?; + +primaryKeys: Map<String, dynamic>; + +hashCode: int | - +List<dynamic> toJson() + +Map<String, dynamic> toJson(); + +SubjectProgress setStartDateBackBy(); + +bool ==() ] - [ChoiceQuestion + [SubjectProgress]o-[Result] + [<abstract>SupabaseObjectFunctions]<:-[SubjectProgress] + + [StudyInvite | - <static>+questionType: String; - +multiple: bool; - +choices: List<Choice> + <static>+tableName: String; + +code: String; + +studyId: String; + +preselectedInterventionIds: List<String>?; + +primaryKeys: Map<String, dynamic> | - +Map<String, dynamic> toJson(); - +Answer<List<String>> constructAnswer() + +Map<String, dynamic> toJson() ] - [<abstract>Question]<:-[ChoiceQuestion] + [<abstract>SupabaseObjectFunctions]<:-[StudyInvite] - [Choice + [StudyUUser | + <static>+tableName: String; +id: String; - +text: String + +email: String; + +preferences: Preferences; + +primaryKeys: Map<String, dynamic> | - +Map<String, dynamic> toJson(); - +String toString() + +Map<String, dynamic> toJson() ] - [<abstract>SliderQuestion + [StudyUUser]o-[Preferences] + [<abstract>SupabaseObjectFunctions]<:-[StudyUUser] + + [Preferences | - +minimum: double; - +maximum: double; - -_initial: double; - +step: double; - +initial: double + +language: String; + +pinnedStudies: Set<String> | - +Answer<num> constructAnswer() + +Map<String, dynamic> toJson() ] - [<abstract>Question]<:-[<abstract>SliderQuestion] - - [AnnotatedScaleQuestion + [Repo | - <static>+questionType: String; - +annotations: List<Annotation> + <static>+tableName: String; + +projectId: String; + +userId: String; + +studyId: String; + +provider: GitProvider; + +webUrl: String?; + +gitUrl: String?; + +primaryKeys: Map<String, dynamic> | +Map<String, dynamic> toJson() ] - [<abstract>SliderQuestion]<:-[AnnotatedScaleQuestion] + [Repo]o-[GitProvider] + [<abstract>SupabaseObjectFunctions]<:-[Repo] - [Annotation - | - +value: int; - +annotation: String + [GitProvider | - +Map<String, dynamic> toJson() + +index: int; + <static>+values: List<GitProvider>; + <static>+gitlab: GitProvider ] - [ScaleQuestion + [GitProvider]o-[GitProvider] + [Enum]<:--[GitProvider] + + [StudySubject | - <static>+questionType: String; - +annotations: List<Annotation>; - +minColor: int?; - +maxColor: int?; - -_step: double; - +step: double; - +isAutostep: bool; - +autostep: int; - +annotationsSorted: List<Annotation>; - +minAnnotation: Annotation?; - +maxAnnotation: Annotation?; - +minLabel: String?; - +maxLabel: String?; - +midAnnotations: List<Annotation>; - +midLabels: List<String>; - +midValues: List<double>; - +values: List<double>; - +minimumAnnotation: String; - +maximumAnnotation: String; - +maximumColor: int; - +minimumColor: int + <static>+tableName: String; + -_controller: StreamController<StudySubject>; + +id: String; + +studyId: String; + +userId: String; + +startedAt: DateTime?; + +selectedInterventionIds: List<String>; + +inviteCode: String?; + +isDeleted: bool; + +study: Study; + +progress: List<SubjectProgress>; + +primaryKeys: Map<String, dynamic>; + +interventionOrder: List<String>; + +selectedInterventions: List<Intervention>; + +daysPerIntervention: int; + +minimumStudyLengthCompleted: bool; + +completedStudy: bool; + +onSave: Stream<StudySubject>; + +hashCode: int | +Map<String, dynamic> toJson(); - +Annotation addAnnotation(); - -void _setAnnotationLabel(); - <static>+int getAutostepSize(); - <static>+List<int> generateMidValues() + +dynamic addResult(); + +Map<DateTime, List<SubjectProgress>> getResultsByDate(); + +DateTime endDate(); + +int getDayOfStudyFor(); + +int getInterventionIndexForDate(); + +Intervention? getInterventionForDate(); + +List<Intervention> getInterventionsInOrder(); + +DateTime startOfPhase(); + +DateTime dayAfterEndOfPhase(); + +List<SubjectProgress> resultsFor(); + +int completedForPhase(); + +int daysLeftForPhase(); + +double percentCompletedForPhase(); + +double percentMissedForPhase(); + +List<SubjectProgress> getTaskProgressForDay(); + +bool completedTaskInstanceForDay(); + +bool completedTaskForDay(); + +int completedTasksFor(); + +bool allTasksCompletedFor(); + +int totalTaskCountFor(); + +List<TaskInstance> scheduleFor(); + +dynamic setStartDateBackBy(); + +dynamic save(); + +Map<String, dynamic> toFullJson(); + +dynamic deleteProgress(); + +dynamic delete(); + +dynamic softDelete(); + <static>+dynamic getStudyHistory(); + +bool ==(); + +String toString() ] - [ScaleQuestion]o-[Annotation] - [<abstract>SliderQuestion]<:-[ScaleQuestion] - [AnnotatedScaleQuestion]<:--[ScaleQuestion] - [VisualAnalogueQuestion]<:--[ScaleQuestion] + [StudySubject]o-[StreamController] + [StudySubject]o-[Study] + [StudySubject]o-[Stream] + [<abstract>SupabaseObjectFunctions]<:-[StudySubject] - [VisualAnalogueQuestion - | - <static>+questionType: String; - +minimumColor: int; - +maximumColor: int; - +minimumAnnotation: String; - +maximumAnnotation: String + [<abstract>InterventionTask | - +Map<String, dynamic> toJson() + <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> ] - [<abstract>SliderQuestion]<:-[VisualAnalogueQuestion] + [<abstract>Task]<:-[<abstract>InterventionTask] - [BooleanQuestion + [Intervention | - <static>+questionType: String + +id: String; + +name: String?; + +description: String?; + +icon: String; + +tasks: List<InterventionTask> | +Map<String, dynamic> toJson(); - +Answer<bool> constructAnswer() + +bool isBaseline() ] - [<abstract>Question]<:-[BooleanQuestion] - - [<abstract>Question + [CheckmarkTask | - <static>+questionTypes: Map<String, Question<dynamic> Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String; - +id: String; - +prompt: String?; - +rationale: String?; - <static>+keyConditional: String; - +conditional: QuestionConditional<V>? + <static>+taskType: String | +Map<String, dynamic> toJson(); - +bool shouldBeShown(); - +Answer<V>? getDefaultAnswer(); - +Type getAnswerType(); - +String toString() + +Map<DateTime, T> extractPropertyResults(); + +Map<String, Type> getAvailableProperties(); + +String? getHumanReadablePropertyName() ] - [<abstract>Question]o-[QuestionConditional] + [<abstract>InterventionTask]<:-[CheckmarkTask] - [EligibilityCriterion + [Contact | - +id: String; - +reason: String?; - +condition: Expression + +organization: String; + +institutionalReviewBoard: String?; + +institutionalReviewBoardNumber: String?; + +researchers: String?; + +email: String; + +website: String; + +phone: String; + +additionalInfo: String? | +Map<String, dynamic> toJson(); - +bool isSatisfied(); - +bool isViolated() + +String toString() ] - [EligibilityCriterion]o-[<abstract>Expression] - - [QuestionnaireTask + [<abstract>SupabaseObject | - <static>+taskType: String; - +questions: StudyUQuestionnaire + +primaryKeys: Map<String, dynamic> + | + +Map<String, dynamic> toJson() + ] + + [<abstract>SupabaseObjectFunctions | - +Map<String, dynamic> toJson(); - +Map<DateTime, T> extractPropertyResults(); - +Map<String, Type> getAvailableProperties(); - +String? getHumanReadablePropertyName() + <static>+T fromJson(); + +dynamic delete(); + +dynamic save() ] - [QuestionnaireTask]o-[StudyUQuestionnaire] - [<abstract>Observation]<:-[QuestionnaireTask] + [<abstract>SupabaseObject]<:--[<abstract>SupabaseObjectFunctions] - [<abstract>Observation + [SupabaseQuery | - <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> + <static>+dynamic getAll(); + <static>+dynamic getById(); + <static>+dynamic batchUpsert(); + <static>+List<T> extractSupabaseList(); + <static>+T extractSupabaseSingleRow(); + <static>+void catchSupabaseException() ] - [<abstract>Task]<:-[<abstract>Observation] - - [StudySchedule + [Analytics | - <static>+numberOfInterventions: int; - +numberOfCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +sequence: PhaseSequence; - +sequenceCustom: String; - +length: int; - +nameOfSequence: String + <static>+logger: Logger; + <static>+onLog: StreamSubscription<LogRecord> | - +Map<String, dynamic> toJson(); - +int getNumberOfPhases(); - +List<int> generateWith(); - -int _nextIntervention(); - -List<int> _generateCycle(); - -List<int> _generateAlternatingCycle(); - -List<int> _generateCounterBalancedCycle(); - -List<int> _generateRandomizedCycle(); - -List<int> _generateCustomizedCycle(); - +String toString() + <static>+void init(); + <static>+void dispose(); + <static>+dynamic captureEvent(); + <static>+dynamic captureException(); + <static>+dynamic captureMessage(); + <static>+void addBreadcrumb() ] - [StudySchedule]o-[PhaseSequence] + [Analytics]o-[Logger] + [Analytics]o-[StreamSubscription] - [PhaseSequence + [StudyUAnalytics | - +index: int; - <static>+values: List<PhaseSequence>; - <static>+alternating: PhaseSequence; - <static>+counterBalanced: PhaseSequence; - <static>+randomized: PhaseSequence; - <static>+customized: PhaseSequence + +enabled: bool; + +dsn: String; + +samplingRate: double?; + <static>+keyStudyUAnalytics: String + | + +Map<String, dynamic> toJson() ] - [PhaseSequence]o-[PhaseSequence] - [Enum]<:--[PhaseSequence] - - + - + - - - - - - + + - + - + - + - + + + - - - - - - - - - - - - - - - - - - - + - - - - - + - + - - - + + + - + - - - + + - + + - + + + + - - - + + - + - + + + + + + + + + + + + + + + - + - - - + + + - + - - - + - + + + + + + + + + + + + + - + - - + + + + + + + + + + - + - + - + - + - + - - - + + - + + - + - + + + + + - + - + - + - + - + - - - + - + - - + + + - - + - + - - + + + - - + - + - - + + + - - + - + - + - + - - - + - + + + - + - - + + - + - - - + + - - - + + - + - + - - + + - + - + + + + + - + - + - + - + + + - + - + + + + + - + - + + + - - - - - - - - - + + + + + - + - - - + - - - - - - - - - - + + - + - + - + - + - + + + + + + + + + + - - - - - + + - + - + - + - - + + + + + + + + + DataReference + + + + + + +task: String + +property: String + + + + + + +Map<String, dynamic> toJson() + +String toString() + +Map<DateTime, T> retrieveFromResults() + + + - - - - - - + + + + + - - - SupabaseObject + + + AverageSection - - - +primaryKeys: Map<String, dynamic> + + + <static>+sectionType: String + +aggregate: TemporalAggregation? + +resultProperty: DataReference<num>? - - - +Map<String, dynamic> toJson() + + + +Map<String, dynamic> toJson() - - - - + + + + + + + + TemporalAggregation + + + + + + +index: int + <static>+values: List<TemporalAggregation> + <static>+day: TemporalAggregation + <static>+phase: TemporalAggregation + <static>+intervention: TemporalAggregation + + + + + + + + + + + + + ReportSection + + + + + + <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)> + <static>+keyType: String + +type: String + +id: String + +title: String? + +description: String? + + + + + + +Map<String, dynamic> toJson() + +String toString() + + + + + + + + + + + + + LinearRegressionSection + + + + + + <static>+sectionType: String + +resultProperty: DataReference<num>? + +alpha: double + +improvement: ImprovementDirection? + + + + + + +Map<String, dynamic> toJson() + + + + + + + + + + + + ImprovementDirection + + + + + + +index: int + <static>+values: List<ImprovementDirection> + <static>+positive: ImprovementDirection + <static>+negative: ImprovementDirection + + + + + + + + + + + Enum + + + + + + + + + + + + + ReportSpecification + + + + + + +primary: ReportSection? + +secondary: List<ReportSection> + + + + + + +Map<String, dynamic> toJson() + +String toString() + + + + + + + + + + + + + NotExpression + + - - - SupabaseObjectFunctions + + + <static>+expressionType: String + +expression: Expression - - - <static>+T fromJson() - +dynamic delete() - +dynamic save() + + + +Map<String, dynamic> toJson() + +bool? evaluate() - - - - + + + + + - - - SupabaseQuery + + + Expression - - - <static>+dynamic getAll() - <static>+dynamic getById() - <static>+dynamic batchUpsert() - <static>+List<T> extractSupabaseList() - <static>+T extractSupabaseSingleRow() - <static>+void catchSupabaseException() + + + <static>+expressionTypes: Map<String, Expression Function(Map<String, dynamic>)> + <static>+keyType: String + +type: String? + + + + + + +Map<String, dynamic> toJson() + +String toString() + +bool? evaluate() - - - - - + + + + + - - - Analytics + + + BooleanExpression - - - <static>+logger: Logger - <static>+onLog: StreamSubscription<LogRecord> + + + <static>+expressionType: String - - - <static>+void init() - <static>+void dispose() - <static>+dynamic captureEvent() - <static>+dynamic captureException() - <static>+dynamic captureMessage() - <static>+void addBreadcrumb() + + + +Map<String, dynamic> toJson() + +bool checkValue() - - - + + + + + - - - Logger + + + ValueExpression - - - - + + + <static>+expressionType: String + +target: String? + + - - - StreamSubscription + + + +bool checkValue() + +bool? evaluate() - - - - - + + + + + - - - StudyUAnalytics + + + ChoiceExpression - - - +enabled: bool - +dsn: String - +samplingRate: double? - <static>+keyStudyUAnalytics: String + + + <static>+expressionType: String + +choices: Set<dynamic> - - - +Map<String, dynamic> toJson() + + + +Map<String, dynamic> toJson() + +bool checkValue() - - - + + + - + StudyResult - + <static>+studyResultTypes: Map<String, StudyResult Function(Map<String, dynamic>)> <static>+keyType: String @@ -1267,7 +1483,7 @@ - + +Map<String, dynamic> toJson() +List<String> getHeaders() @@ -1276,81 +1492,25 @@ - - - - - - - - - NumericResult - - - - - - <static>+studyResultType: String - +resultProperty: DataReference<num> - - - - - - +Map<String, dynamic> toJson() - +List<String> getHeaders() - +List<dynamic> getValues() - - - - - - - - - - - - - DataReference - - - - - - +task: String - +property: String - - - - - - +Map<String, dynamic> toJson() - +String toString() - +Map<DateTime, T> retrieveFromResults() - - - - - - - + + + - + InterventionResult - + <static>+studyResultType: String - + +Map<String, dynamic> toJson() +List<String> getHeaders() @@ -1359,1504 +1519,1445 @@ - - - - - - - - InterventionTask - - - - - - <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> - - - - - - - - - + + + + + - - - Task + + + NumericResult - - - <static>+keyType: String - +type: String - +id: String - +title: String? - +header: String? - +footer: String? - +schedule: Schedule + + + <static>+studyResultType: String + +resultProperty: DataReference<num> - - - +Map<String, dynamic> toJson() - +String toString() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() + + + +Map<String, dynamic> toJson() + +List<String> getHeaders() + +List<dynamic> getValues() - - - - - + + + + + - - - Intervention + + + ConsentItem - - - +id: String - +name: String? - +description: String? - +icon: String - +tasks: List<InterventionTask> + + + +id: String + +title: String? + +description: String? + +iconName: String - - - +Map<String, dynamic> toJson() - +bool isBaseline() + + + +Map<String, dynamic> toJson() + +String toString() - - - - - + + + + + - - - CheckmarkTask + + + QuestionConditional - - - <static>+taskType: String + + + <static>+keyDefaultValue: String + +defaultValue: V? + +condition: Expression - - - +Map<String, dynamic> toJson() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() + + + <static>-QuestionConditional<V> _fromJson() + +Map<String, dynamic> toJson() - - - - - + + + + + - - - ValueExpression + + + Question - - - <static>+expressionType: String - +target: String? + + + <static>+questionTypes: Map<String, Question<dynamic> Function(Map<String, dynamic>)> + <static>+keyType: String + +type: String + +id: String + +prompt: String? + +rationale: String? + <static>+keyConditional: String + +conditional: QuestionConditional<V>? - - - +bool checkValue() - +bool? evaluate() + + + +Map<String, dynamic> toJson() + +bool shouldBeShown() + +Answer<V>? getDefaultAnswer() + +Type getAnswerType() + +String toString() - - - - - + + + + + - - - Expression + + + ChoiceQuestion - - - <static>+expressionTypes: Map<String, Expression Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String? + + + <static>+questionType: String + +multiple: bool + +choices: List<Choice> - - - +Map<String, dynamic> toJson() - +String toString() - +bool? evaluate() + + + +Map<String, dynamic> toJson() + +Answer<List<String>> constructAnswer() - - - - - + + + + + - - - BooleanExpression + + + Choice - - - <static>+expressionType: String + + + +id: String + +text: String - - - +Map<String, dynamic> toJson() - +bool checkValue() + + + +Map<String, dynamic> toJson() + +String toString() - - - - - + + + + + - - - ChoiceExpression + + + BooleanQuestion - - - <static>+expressionType: String - +choices: Set<dynamic> + + + <static>+questionType: String - - - +Map<String, dynamic> toJson() - +bool checkValue() + + + +Map<String, dynamic> toJson() + +Answer<bool> constructAnswer() - - - - - + + + + + - - - NotExpression + + + SliderQuestion - - - <static>+expressionType: String - +expression: Expression + + + +minimum: double + +maximum: double + -_initial: double + +step: double + +initial: double - - - +Map<String, dynamic> toJson() - +bool? evaluate() + + + +Answer<num> constructAnswer() - - - - - + + + + + - - - StudyInvite + + + ScaleQuestion - - - <static>+tableName: String - +code: String - +studyId: String - +preselectedInterventionIds: List<String>? - +primaryKeys: Map<String, dynamic> + + + <static>+questionType: String + +annotations: List<Annotation> + +minColor: int? + +maxColor: int? + -_step: double + +step: double + +isAutostep: bool + +autostep: int + +annotationsSorted: List<Annotation> + +minAnnotation: Annotation? + +maxAnnotation: Annotation? + +minLabel: String? + +maxLabel: String? + +midAnnotations: List<Annotation> + +midLabels: List<String> + +midValues: List<double> + +values: List<double> + +minimumAnnotation: String + +maximumAnnotation: String + +maximumColor: int + +minimumColor: int - - - +Map<String, dynamic> toJson() + + + +Map<String, dynamic> toJson() + +Annotation addAnnotation() + -void _setAnnotationLabel() + <static>+int getAutostepSize() + <static>+List<int> generateMidValues() - - - - - + + + + + - - - SubjectProgress + + + Annotation - - - <static>+tableName: String - +completedAt: DateTime? - +subjectId: String - +interventionId: String - +taskId: String - +resultType: String - +result: Result<dynamic> - +startedAt: DateTime? - +primaryKeys: Map<String, dynamic> - +hashCode: int + + + +value: int + +annotation: String - - - +Map<String, dynamic> toJson() - +SubjectProgress setStartDateBackBy() - +bool ==() + + + +Map<String, dynamic> toJson() - - - - - + + + + + - - - Result + + + AnnotatedScaleQuestion - - - <static>+keyType: String - +type: String - +periodId: String? - <static>+keyResult: String - +result: T + + + <static>+questionType: String + +annotations: List<Annotation> - - - +Map<String, dynamic> toJson() - <static>-Result<dynamic> _fromJson() + + + +Map<String, dynamic> toJson() - - - - - + + + + + - - - StudySubject + + + VisualAnalogueQuestion - - - <static>+tableName: String - -_controller: StreamController<StudySubject> - +id: String - +studyId: String - +userId: String - +startedAt: DateTime? - +selectedInterventionIds: List<String> - +inviteCode: String? - +isDeleted: bool - +study: Study - +progress: List<SubjectProgress> - +primaryKeys: Map<String, dynamic> - +interventionOrder: List<String> - +selectedInterventions: List<Intervention> - +daysPerIntervention: int - +minimumStudyLengthCompleted: bool - +completedStudy: bool - +onSave: Stream<StudySubject> - +hashCode: int + + + <static>+questionType: String + +minimumColor: int + +maximumColor: int + +minimumAnnotation: String + +maximumAnnotation: String - - - +Map<String, dynamic> toJson() - +dynamic addResult() - +Map<DateTime, List<SubjectProgress>> getResultsByDate() - +DateTime endDate() - +int getDayOfStudyFor() - +int getInterventionIndexForDate() - +Intervention? getInterventionForDate() - +List<Intervention> getInterventionsInOrder() - +DateTime startOfPhase() - +DateTime dayAfterEndOfPhase() - +List<SubjectProgress> resultsFor() - +int completedForPhase() - +int daysLeftForPhase() - +double percentCompletedForPhase() - +double percentMissedForPhase() - +List<SubjectProgress> getTaskProgressForDay() - +bool completedTaskInstanceForDay() - +bool completedTaskForDay() - +int completedTasksFor() - +bool allTasksCompletedFor() - +int totalTaskCountFor() - +List<TaskInstance> scheduleFor() - +dynamic setStartDateBackBy() - +dynamic save() - +Map<String, dynamic> toFullJson() - +dynamic deleteProgress() - +dynamic delete() - +dynamic softDelete() - <static>+dynamic getStudyHistory() - +bool ==() - +String toString() + + + +Map<String, dynamic> toJson() - - - + + + + + - - - StreamController + + + Answer - - - - - - - - - - Study + + + +question: String + +timestamp: DateTime + <static>+keyResponse: String + +response: V - - - <static>+tableName: String - <static>+baselineID: String - +id: String - +title: String? - +description: String? - +userId: String - +participation: Participation - +resultSharing: ResultSharing - +contact: Contact - +iconName: String - +published: bool - +questionnaire: StudyUQuestionnaire - +eligibilityCriteria: List<EligibilityCriterion> - +consent: List<ConsentItem> - +interventions: List<Intervention> - +observations: List<Observation> - +schedule: StudySchedule - +reportSpecification: ReportSpecification - +results: List<StudyResult> - +collaboratorEmails: List<String> - +registryPublished: bool - +participantCount: int - +endedCount: int - +activeSubjectCount: int - +missedDays: List<int> - +repo: Repo? - +invites: List<StudyInvite>? - +participants: List<StudySubject>? - +participantsProgress: List<SubjectProgress>? - +createdAt: DateTime? - +primaryKeys: Map<String, dynamic> - +hasEligibilityCheck: bool - +hasConsentCheck: bool - +totalMissedDays: int - +percentageMissedDays: double - +status: StudyStatus - +isDraft: bool - +isRunning: bool - +isClosed: bool + + + +Map<String, dynamic> toJson() + <static>+Answer<dynamic> fromJson() + +String toString() - - - +Map<String, dynamic> toJson() - <static>+dynamic getResearcherDashboardStudies() - <static>+dynamic publishedPublicStudies() - +bool isOwner() - +bool isEditor() - +bool canEdit() - <static>+dynamic fetchResultsCSVTable() - +bool isReadonly() - +String toString() + + + + + + + + + + StudyUQuestionnaire - - - - + + + +questions: List<Question<dynamic>> + + - - - Stream + + + +List<dynamic> toJson() - - - - - + + + + + - - - AppConfig + + + EligibilityCriterion - - - <static>+tableName: String - +id: String - +contact: Contact - +appPrivacy: Map<String, String> - +appTerms: Map<String, String> - +designerPrivacy: Map<String, String> - +designerTerms: Map<String, String> - +imprint: Map<String, String> - +analytics: StudyUAnalytics - +primaryKeys: Map<String, dynamic> + + + +id: String + +reason: String? + +condition: Expression - - - +Map<String, dynamic> toJson() - <static>+dynamic getAppConfig() - <static>+dynamic getAppContact() + + + +Map<String, dynamic> toJson() + +bool isSatisfied() + +bool isViolated() - - - - - + + + + + - - - Contact + + + StudySchedule - - - +organization: String - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String - +website: String - +phone: String - +additionalInfo: String? + + + <static>+numberOfInterventions: int + +numberOfCycles: int + +phaseDuration: int + +includeBaseline: bool + +sequence: PhaseSequence + +sequenceCustom: String + +length: int + +nameOfSequence: String - - - +Map<String, dynamic> toJson() - +String toString() + + + +Map<String, dynamic> toJson() + +int getNumberOfPhases() + +List<int> generateWith() + -int _nextIntervention() + -List<int> _generateCycle() + -List<int> _generateAlternatingCycle() + -List<int> _generateCounterBalancedCycle() + -List<int> _generateRandomizedCycle() + -List<int> _generateCustomizedCycle() + +String toString() - - - - - - - - - Repo - - + + + + - - - <static>+tableName: String - +projectId: String - +userId: String - +studyId: String - +provider: GitProvider - +webUrl: String - +gitUrl: String - +primaryKeys: Map<String, dynamic> + + + PhaseSequence - - - +Map<String, dynamic> toJson() + + + +index: int + <static>+values: List<PhaseSequence> + <static>+alternating: PhaseSequence + <static>+counterBalanced: PhaseSequence + <static>+randomized: PhaseSequence + <static>+customized: PhaseSequence - - - - + + + + + - - - GitProvider + + + QuestionnaireTask - - - +index: int - <static>+values: List<GitProvider> - <static>+gitlab: GitProvider + + + <static>+taskType: String + +questions: StudyUQuestionnaire - - - - - - - - Enum + + + +Map<String, dynamic> toJson() + +Map<DateTime, T> extractPropertyResults() + +Map<String, Type> getAvailableProperties() + +String? getHumanReadablePropertyName() - - - - + + + + - - - Participation + + + Observation - - - +index: int - <static>+values: List<Participation> - <static>+open: Participation - <static>+invite: Participation + + + <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> - - - - + + + + + - - - ResultSharing + + + Task - - - +index: int - <static>+values: List<ResultSharing> - <static>+public: ResultSharing - <static>+private: ResultSharing - <static>+organization: ResultSharing + + + <static>+keyType: String + +type: String + +id: String + +title: String? + +header: String? + +footer: String? + +schedule: Schedule + + + + + + +Map<String, dynamic> toJson() + +String toString() + +Map<DateTime, T> extractPropertyResults() + +Map<String, Type> getAvailableProperties() + +String? getHumanReadablePropertyName() - - - - - + + + + + - - - StudyUQuestionnaire + + + Schedule - - - +questions: List<Question<dynamic>> + + + +completionPeriods: List<CompletionPeriod> + +reminders: List<StudyUTimeOfDay> - - - +List<dynamic> toJson() + + + +Map<String, dynamic> toJson() + +String toString() - - - - - + + + + + - - - StudySchedule + + + CompletionPeriod - - - <static>+numberOfInterventions: int - +numberOfCycles: int - +phaseDuration: int - +includeBaseline: bool - +sequence: PhaseSequence - +sequenceCustom: String - +length: int - +nameOfSequence: String + + + +id: String + +unlockTime: StudyUTimeOfDay + +lockTime: StudyUTimeOfDay - - - +Map<String, dynamic> toJson() - +int getNumberOfPhases() - +List<int> generateWith() - -int _nextIntervention() - -List<int> _generateCycle() - -List<int> _generateAlternatingCycle() - -List<int> _generateCounterBalancedCycle() - -List<int> _generateRandomizedCycle() - -List<int> _generateCustomizedCycle() - +String toString() + + + +Map<String, dynamic> toJson() + +String formatted() + +String toString() + +bool contains() - - - - - + + + + + - - - ReportSpecification + + + StudyUTimeOfDay - - - +primary: ReportSection? - +secondary: List<ReportSection> + + + +hour: int + +minute: int - - - +Map<String, dynamic> toJson() - +String toString() + + + +String toJson() + +String toString() + +bool earlierThan() - - - - + + + + + - - - StudyStatus + + + TaskInstance - - - +index: int - <static>+values: List<StudyStatus> - <static>+draft: StudyStatus - <static>+running: StudyStatus - <static>+closed: StudyStatus + + + +task: Task + +id: String + +completionPeriod: CompletionPeriod - - - - - - - - - - LinearRegressionSection + + + <static>-Task _taskFromStudy() + <static>-Task _taskFromSubject() - - - <static>+sectionType: String - +resultProperty: DataReference<num>? - +alpha: double - +improvement: ImprovementDirection? - - + + + + + + - - - +Map<String, dynamic> toJson() + + + Result - - - - - - - - - ImprovementDirection + + + <static>+keyType: String + +type: String + +periodId: String? + <static>+keyResult: String + +result: T - - - +index: int - <static>+values: List<ImprovementDirection> - <static>+positive: ImprovementDirection - <static>+negative: ImprovementDirection + + + +Map<String, dynamic> toJson() + <static>-Result<dynamic> _fromJson() - - - - - + + + + + - - - ReportSection + + + Study - - - <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String - +id: String - +title: String? - +description: String? + + + <static>+tableName: String + <static>+baselineID: String + +id: String + +title: String? + +description: String? + +userId: String + +participation: Participation + +resultSharing: ResultSharing + +contact: Contact + +iconName: String + +published: bool + +questionnaire: StudyUQuestionnaire + +eligibilityCriteria: List<EligibilityCriterion> + +consent: List<ConsentItem> + +interventions: List<Intervention> + +observations: List<Observation> + +schedule: StudySchedule + +reportSpecification: ReportSpecification + +results: List<StudyResult> + +collaboratorEmails: List<String> + +registryPublished: bool + +participantCount: int + +endedCount: int + +activeSubjectCount: int + +missedDays: List<int> + +repo: Repo? + +invites: List<StudyInvite>? + +participants: List<StudySubject>? + +participantsProgress: List<SubjectProgress>? + +createdAt: DateTime? + +primaryKeys: Map<String, dynamic> + +hasEligibilityCheck: bool + +hasConsentCheck: bool + +totalMissedDays: int + +percentageMissedDays: double + +status: StudyStatus + +isDraft: bool + +isRunning: bool + +isClosed: bool - - - +Map<String, dynamic> toJson() - +String toString() + + + +Map<String, dynamic> toJson() + <static>+dynamic getResearcherDashboardStudies() + <static>+dynamic publishedPublicStudies() + +bool isOwner() + +bool isEditor() + +bool canEdit() + <static>+dynamic fetchResultsCSVTable() + +bool isReadonly() + +String toString() + +int compareTo() - - - - - - - - - AverageSection - - + + + + - - - <static>+sectionType: String - +aggregate: TemporalAggregation? - +resultProperty: DataReference<num>? + + + Participation - - - +Map<String, dynamic> toJson() + + + +index: int + <static>+values: List<Participation> + <static>+open: Participation + <static>+invite: Participation - - - - + + + + - - - TemporalAggregation + + + ResultSharing - - - +index: int - <static>+values: List<TemporalAggregation> - <static>+day: TemporalAggregation - <static>+phase: TemporalAggregation - <static>+intervention: TemporalAggregation + + + +index: int + <static>+values: List<ResultSharing> + <static>+public: ResultSharing + <static>+private: ResultSharing + <static>+organization: ResultSharing - - - - - + + + + + - - - ConsentItem + + + Contact - - - +id: String - +title: String? - +description: String? - +iconName: String + + + +organization: String + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String + +website: String + +phone: String + +additionalInfo: String? - - - +Map<String, dynamic> toJson() - +String toString() + + + +Map<String, dynamic> toJson() + +String toString() - - - - - + + + + + - - - Schedule + + + Repo - - - +completionPeriods: List<CompletionPeriod> - +reminders: List<StudyUTimeOfDay> + + + <static>+tableName: String + +projectId: String + +userId: String + +studyId: String + +provider: GitProvider + +webUrl: String? + +gitUrl: String? + +primaryKeys: Map<String, dynamic> - - - +Map<String, dynamic> toJson() - +String toString() + + + +Map<String, dynamic> toJson() - - - - - - - - - CompletionPeriod - - + + + + - - - +id: String - +unlockTime: StudyUTimeOfDay - +lockTime: StudyUTimeOfDay + + + StudyStatus - - - +Map<String, dynamic> toJson() - +String formatted() - +String toString() - +bool contains() + + + +index: int + <static>+values: List<StudyStatus> + <static>+draft: StudyStatus + <static>+running: StudyStatus + <static>+closed: StudyStatus - - - - - + + + + - - - StudyUTimeOfDay + + + SupabaseObjectFunctions - - - +hour: int - +minute: int + + + <static>+T fromJson() + +dynamic delete() + +dynamic save() - - - +String toJson() - +String toString() - +bool earlierThan() + + + + + + + + Comparable - - - - - + + + + + - - - TaskInstance + + + AppConfig - - - +task: Task - +id: String - +completionPeriod: CompletionPeriod + + + <static>+tableName: String + +id: String + +contact: Contact + +appPrivacy: Map<String, String> + +appTerms: Map<String, String> + +designerPrivacy: Map<String, String> + +designerTerms: Map<String, String> + +imprint: Map<String, String> + +analytics: StudyUAnalytics + +primaryKeys: Map<String, dynamic> - - - <static>-Task _taskFromStudy() - <static>-Task _taskFromSubject() + + + +Map<String, dynamic> toJson() + <static>+dynamic getAppConfig() + <static>+dynamic getAppContact() - - - - - + + + + + - - - Answer + + + StudyUAnalytics - - - +question: String - +timestamp: DateTime - <static>+keyResponse: String - +response: V + + + +enabled: bool + +dsn: String + +samplingRate: double? + <static>+keyStudyUAnalytics: String - - - +Map<String, dynamic> toJson() - <static>+Answer<dynamic> fromJson() - +String toString() + + + +Map<String, dynamic> toJson() - - - - - + + + + + - - - QuestionConditional + + + SubjectProgress - - - <static>+keyDefaultValue: String - +defaultValue: V? - +condition: Expression + + + <static>+tableName: String + +completedAt: DateTime? + +subjectId: String + +interventionId: String + +taskId: String + +resultType: String + +result: Result<dynamic> + +startedAt: DateTime? + +primaryKeys: Map<String, dynamic> + +hashCode: int - - - <static>-QuestionConditional<V> _fromJson() - +Map<String, dynamic> toJson() + + + +Map<String, dynamic> toJson() + +SubjectProgress setStartDateBackBy() + +bool ==() - - - - - + + + + + - - - ChoiceQuestion + + + StudyInvite - - - <static>+questionType: String - +multiple: bool - +choices: List<Choice> + + + <static>+tableName: String + +code: String + +studyId: String + +preselectedInterventionIds: List<String>? + +primaryKeys: Map<String, dynamic> - - - +Map<String, dynamic> toJson() - +Answer<List<String>> constructAnswer() + + + +Map<String, dynamic> toJson() - - - - - + + + + + - - - Question + + + StudyUUser - - - <static>+questionTypes: Map<String, Question<dynamic> Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String - +id: String - +prompt: String? - +rationale: String? - <static>+keyConditional: String - +conditional: QuestionConditional<V>? + + + <static>+tableName: String + +id: String + +email: String + +preferences: Preferences + +primaryKeys: Map<String, dynamic> - - - +Map<String, dynamic> toJson() - +bool shouldBeShown() - +Answer<V>? getDefaultAnswer() - +Type getAnswerType() - +String toString() + + + +Map<String, dynamic> toJson() - - - - - + + + + + - - - Choice + + + Preferences - - - +id: String - +text: String + + + +language: String + +pinnedStudies: Set<String> - - - +Map<String, dynamic> toJson() - +String toString() + + + +Map<String, dynamic> toJson() - - - - - - - - - SliderQuestion - - + + + + - - - +minimum: double - +maximum: double - -_initial: double - +step: double - +initial: double + + + GitProvider - - - +Answer<num> constructAnswer() + + + +index: int + <static>+values: List<GitProvider> + <static>+gitlab: GitProvider - - - - - + + + + + - - - AnnotatedScaleQuestion + + + StudySubject - - - <static>+questionType: String - +annotations: List<Annotation> + + + <static>+tableName: String + -_controller: StreamController<StudySubject> + +id: String + +studyId: String + +userId: String + +startedAt: DateTime? + +selectedInterventionIds: List<String> + +inviteCode: String? + +isDeleted: bool + +study: Study + +progress: List<SubjectProgress> + +primaryKeys: Map<String, dynamic> + +interventionOrder: List<String> + +selectedInterventions: List<Intervention> + +daysPerIntervention: int + +minimumStudyLengthCompleted: bool + +completedStudy: bool + +onSave: Stream<StudySubject> + +hashCode: int - - - +Map<String, dynamic> toJson() + + + +Map<String, dynamic> toJson() + +dynamic addResult() + +Map<DateTime, List<SubjectProgress>> getResultsByDate() + +DateTime endDate() + +int getDayOfStudyFor() + +int getInterventionIndexForDate() + +Intervention? getInterventionForDate() + +List<Intervention> getInterventionsInOrder() + +DateTime startOfPhase() + +DateTime dayAfterEndOfPhase() + +List<SubjectProgress> resultsFor() + +int completedForPhase() + +int daysLeftForPhase() + +double percentCompletedForPhase() + +double percentMissedForPhase() + +List<SubjectProgress> getTaskProgressForDay() + +bool completedTaskInstanceForDay() + +bool completedTaskForDay() + +int completedTasksFor() + +bool allTasksCompletedFor() + +int totalTaskCountFor() + +List<TaskInstance> scheduleFor() + +dynamic setStartDateBackBy() + +dynamic save() + +Map<String, dynamic> toFullJson() + +dynamic deleteProgress() + +dynamic delete() + +dynamic softDelete() + <static>+dynamic getStudyHistory() + +bool ==() + +String toString() - - - - - + + + - - - Annotation + + + StreamController - - - +value: int - +annotation: String - - + + + + - - - +Map<String, dynamic> toJson() + + + Stream - - - - - - - - - ScaleQuestion - - + + + + - - - <static>+questionType: String - +annotations: List<Annotation> - +minColor: int? - +maxColor: int? - -_step: double - +step: double - +isAutostep: bool - +autostep: int - +annotationsSorted: List<Annotation> - +minAnnotation: Annotation? - +maxAnnotation: Annotation? - +minLabel: String? - +maxLabel: String? - +midAnnotations: List<Annotation> - +midLabels: List<String> - +midValues: List<double> - +values: List<double> - +minimumAnnotation: String - +maximumAnnotation: String - +maximumColor: int - +minimumColor: int + + + InterventionTask - - - +Map<String, dynamic> toJson() - +Annotation addAnnotation() - -void _setAnnotationLabel() - <static>+int getAutostepSize() - <static>+List<int> generateMidValues() + + + <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> - - - - - + + + + + - - - VisualAnalogueQuestion + + + Intervention - - - <static>+questionType: String - +minimumColor: int - +maximumColor: int - +minimumAnnotation: String - +maximumAnnotation: String + + + +id: String + +name: String? + +description: String? + +icon: String + +tasks: List<InterventionTask> - - - +Map<String, dynamic> toJson() + + + +Map<String, dynamic> toJson() + +bool isBaseline() - - - - - + + + + + - - - BooleanQuestion + + + CheckmarkTask - - - <static>+questionType: String + + + <static>+taskType: String - - - +Map<String, dynamic> toJson() - +Answer<bool> constructAnswer() + + + +Map<String, dynamic> toJson() + +Map<DateTime, T> extractPropertyResults() + +Map<String, Type> getAvailableProperties() + +String? getHumanReadablePropertyName() - - - - - + + + + + - - - EligibilityCriterion + + + SupabaseObject - - - +id: String - +reason: String? - +condition: Expression + + + +primaryKeys: Map<String, dynamic> - - - +Map<String, dynamic> toJson() - +bool isSatisfied() - +bool isViolated() + + + +Map<String, dynamic> toJson() - - - - - + + + + - - - QuestionnaireTask + + + SupabaseQuery - - - <static>+taskType: String - +questions: StudyUQuestionnaire + + + <static>+dynamic getAll() + <static>+dynamic getById() + <static>+dynamic batchUpsert() + <static>+List<T> extractSupabaseList() + <static>+T extractSupabaseSingleRow() + <static>+void catchSupabaseException() - - - +Map<String, dynamic> toJson() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() + + + + + + + + + + Analytics - - - - - - - - - Observation + + + <static>+logger: Logger + <static>+onLog: StreamSubscription<LogRecord> - - - <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> + + + <static>+void init() + <static>+void dispose() + <static>+dynamic captureEvent() + <static>+dynamic captureException() + <static>+dynamic captureMessage() + <static>+void addBreadcrumb() - - - - + + + - - - PhaseSequence + + + Logger - - - +index: int - <static>+values: List<PhaseSequence> - <static>+alternating: PhaseSequence - <static>+counterBalanced: PhaseSequence - <static>+randomized: PhaseSequence - <static>+customized: PhaseSequence + + + + + + + + StreamSubscription diff --git a/docs/uml/core/lib/uml.svg b/docs/uml/core/lib/uml.svg index dba4d6ea2..2e673cef6 100644 --- a/docs/uml/core/lib/uml.svg +++ b/docs/uml/core/lib/uml.svg @@ -1,134 +1,99 @@ - - [<abstract>SupabaseObject + + [DataReference | - +primaryKeys: Map<String, dynamic> - | - +Map<String, dynamic> toJson() - ] - - [<abstract>SupabaseObjectFunctions - | - <static>+T fromJson(); - +dynamic delete(); - +dynamic save() - ] - - [<abstract>SupabaseObject]<:--[<abstract>SupabaseObjectFunctions] - - [SupabaseQuery - | - <static>+dynamic getAll(); - <static>+dynamic getById(); - <static>+dynamic batchUpsert(); - <static>+List<T> extractSupabaseList(); - <static>+T extractSupabaseSingleRow(); - <static>+void catchSupabaseException() - ] - - [Analytics - | - <static>+logger: Logger; - <static>+onLog: StreamSubscription<LogRecord> + +task: String; + +property: String | - <static>+void init(); - <static>+void dispose(); - <static>+dynamic captureEvent(); - <static>+dynamic captureException(); - <static>+dynamic captureMessage(); - <static>+void addBreadcrumb() + +Map<String, dynamic> toJson(); + +String toString(); + +Map<DateTime, T> retrieveFromResults() ] - [Analytics]o-[Logger] - [Analytics]o-[StreamSubscription] - - [StudyUAnalytics + [AverageSection | - +enabled: bool; - +dsn: String; - +samplingRate: double?; - <static>+keyStudyUAnalytics: String + <static>+sectionType: String; + +aggregate: TemporalAggregation?; + +resultProperty: DataReference<num>? | +Map<String, dynamic> toJson() ] - [<abstract>StudyResult - | - <static>+studyResultTypes: Map<String, StudyResult Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String; - +id: String; - +filename: String - | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() - ] + [AverageSection]o-[TemporalAggregation] + [AverageSection]o-[DataReference] + [<abstract>ReportSection]<:-[AverageSection] - [NumericResult + [LinearRegressionSection | - <static>+studyResultType: String; - +resultProperty: DataReference<num> + <static>+sectionType: String; + +resultProperty: DataReference<num>?; + +alpha: double; + +improvement: ImprovementDirection? | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() + +Map<String, dynamic> toJson() ] - [NumericResult]o-[DataReference] - [<abstract>StudyResult]<:-[NumericResult] + [LinearRegressionSection]o-[DataReference] + [LinearRegressionSection]o-[ImprovementDirection] + [<abstract>ReportSection]<:-[LinearRegressionSection] - [InterventionResult - | - <static>+studyResultType: String + [ImprovementDirection | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() + +index: int; + <static>+values: List<ImprovementDirection>; + <static>+positive: ImprovementDirection; + <static>+negative: ImprovementDirection ] - [<abstract>StudyResult]<:-[InterventionResult] + [ImprovementDirection]o-[ImprovementDirection] + [Enum]<:--[ImprovementDirection] - [<abstract>InterventionTask + [TemporalAggregation | - <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> + +index: int; + <static>+values: List<TemporalAggregation>; + <static>+day: TemporalAggregation; + <static>+phase: TemporalAggregation; + <static>+intervention: TemporalAggregation ] - [<abstract>Task]<:-[<abstract>InterventionTask] + [TemporalAggregation]o-[TemporalAggregation] + [Enum]<:--[TemporalAggregation] - [Intervention + [ReportSpecification | - +id: String; - +name: String?; - +description: String?; - +icon: String; - +tasks: List<InterventionTask> + +primary: ReportSection?; + +secondary: List<ReportSection> | +Map<String, dynamic> toJson(); - +bool isBaseline() + +String toString() ] - [CheckmarkTask + [ReportSpecification]o-[<abstract>ReportSection] + + [<abstract>ReportSection | - <static>+taskType: String + <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)>; + <static>+keyType: String; + +type: String; + +id: String; + +title: String?; + +description: String? | +Map<String, dynamic> toJson(); - +Map<DateTime, T> extractPropertyResults(); - +Map<String, Type> getAvailableProperties(); - +String? getHumanReadablePropertyName() + +String toString() ] - [<abstract>InterventionTask]<:-[CheckmarkTask] - - [<abstract>ValueExpression + [NotExpression | <static>+expressionType: String; - +target: String? + +expression: Expression | - +bool checkValue(); + +Map<String, dynamic> toJson(); +bool? evaluate() ] - [<abstract>Expression]<:-[<abstract>ValueExpression] + [NotExpression]o-[<abstract>Expression] + [<abstract>Expression]<:-[NotExpression] [BooleanExpression | @@ -140,28 +105,27 @@ [<abstract>ValueExpression]<:-[BooleanExpression] - [ChoiceExpression + [<abstract>ValueExpression | <static>+expressionType: String; - +choices: Set<dynamic> + +target: String? | - +Map<String, dynamic> toJson(); - +bool checkValue() + +bool checkValue(); + +bool? evaluate() ] - [<abstract>ValueExpression]<:-[ChoiceExpression] + [<abstract>Expression]<:-[<abstract>ValueExpression] - [NotExpression + [ChoiceExpression | <static>+expressionType: String; - +expression: Expression + +choices: Set<dynamic> | +Map<String, dynamic> toJson(); - +bool? evaluate() + +bool checkValue() ] - [NotExpression]o-[<abstract>Expression] - [<abstract>Expression]<:-[NotExpression] + [<abstract>ValueExpression]<:-[ChoiceExpression] [<abstract>Expression | @@ -174,354 +138,288 @@ +bool? evaluate() ] - [DataReference + [<abstract>StudyResult | - +task: String; - +property: String + <static>+studyResultTypes: Map<String, StudyResult Function(Map<String, dynamic>)>; + <static>+keyType: String; + +type: String; + +id: String; + +filename: String | +Map<String, dynamic> toJson(); - +String toString(); - +Map<DateTime, T> retrieveFromResults() + +List<String> getHeaders(); + +List<dynamic> getValues() ] - [StudyInvite + [InterventionResult | - <static>+tableName: String; - +code: String; - +studyId: String; - +preselectedInterventionIds: List<String>?; - +primaryKeys: Map<String, dynamic> + <static>+studyResultType: String | - +Map<String, dynamic> toJson() + +Map<String, dynamic> toJson(); + +List<String> getHeaders(); + +List<dynamic> getValues() ] - [<abstract>SupabaseObjectFunctions]<:-[StudyInvite] + [<abstract>StudyResult]<:-[InterventionResult] - [SubjectProgress + [NumericResult | - <static>+tableName: String; - +completedAt: DateTime?; - +subjectId: String; - +interventionId: String; - +taskId: String; - +resultType: String; - +result: Result<dynamic>; - +startedAt: DateTime?; - +primaryKeys: Map<String, dynamic>; - +hashCode: int + <static>+studyResultType: String; + +resultProperty: DataReference<num> | +Map<String, dynamic> toJson(); - +SubjectProgress setStartDateBackBy(); - +bool ==() + +List<String> getHeaders(); + +List<dynamic> getValues() ] - [SubjectProgress]o-[Result] - [<abstract>SupabaseObjectFunctions]<:-[SubjectProgress] + [NumericResult]o-[DataReference] + [<abstract>StudyResult]<:-[NumericResult] - [StudySubject + [ConsentItem | - <static>+tableName: String; - -_controller: StreamController<StudySubject>; +id: String; - +studyId: String; - +userId: String; - +startedAt: DateTime?; - +selectedInterventionIds: List<String>; - +inviteCode: String?; - +isDeleted: bool; - +study: Study; - +progress: List<SubjectProgress>; - +primaryKeys: Map<String, dynamic>; - +interventionOrder: List<String>; - +selectedInterventions: List<Intervention>; - +daysPerIntervention: int; - +minimumStudyLengthCompleted: bool; - +completedStudy: bool; - +onSave: Stream<StudySubject>; - +hashCode: int + +title: String?; + +description: String?; + +iconName: String | +Map<String, dynamic> toJson(); - +dynamic addResult(); - +Map<DateTime, List<SubjectProgress>> getResultsByDate(); - +DateTime endDate(); - +int getDayOfStudyFor(); - +int getInterventionIndexForDate(); - +Intervention? getInterventionForDate(); - +List<Intervention> getInterventionsInOrder(); - +DateTime startOfPhase(); - +DateTime dayAfterEndOfPhase(); - +List<SubjectProgress> resultsFor(); - +int completedForPhase(); - +int daysLeftForPhase(); - +double percentCompletedForPhase(); - +double percentMissedForPhase(); - +List<SubjectProgress> getTaskProgressForDay(); - +bool completedTaskInstanceForDay(); - +bool completedTaskForDay(); - +int completedTasksFor(); - +bool allTasksCompletedFor(); - +int totalTaskCountFor(); - +List<TaskInstance> scheduleFor(); - +dynamic setStartDateBackBy(); - +dynamic save(); - +Map<String, dynamic> toFullJson(); - +dynamic deleteProgress(); - +dynamic delete(); - +dynamic softDelete(); - <static>+dynamic getStudyHistory(); - +bool ==(); +String toString() ] - [StudySubject]o-[StreamController] - [StudySubject]o-[Study] - [StudySubject]o-[Stream] - [<abstract>SupabaseObjectFunctions]<:-[StudySubject] - - [AppConfig + [QuestionConditional | - <static>+tableName: String; - +id: String; - +contact: Contact; - +appPrivacy: Map<String, String>; - +appTerms: Map<String, String>; - +designerPrivacy: Map<String, String>; - +designerTerms: Map<String, String>; - +imprint: Map<String, String>; - +analytics: StudyUAnalytics; - +primaryKeys: Map<String, dynamic> + <static>+keyDefaultValue: String; + +defaultValue: V?; + +condition: Expression | - +Map<String, dynamic> toJson(); - <static>+dynamic getAppConfig(); - <static>+dynamic getAppContact() + <static>-QuestionConditional<V> _fromJson(); + +Map<String, dynamic> toJson() ] - [AppConfig]o-[Contact] - [AppConfig]o-[StudyUAnalytics] - [<abstract>SupabaseObjectFunctions]<:-[AppConfig] + [QuestionConditional]o-[<abstract>Expression] - [Repo + [<abstract>Question | - <static>+tableName: String; - +projectId: String; - +userId: String; - +studyId: String; - +provider: GitProvider; - +webUrl: String; - +gitUrl: String; - +primaryKeys: Map<String, dynamic> + <static>+questionTypes: Map<String, Question<dynamic> Function(Map<String, dynamic>)>; + <static>+keyType: String; + +type: String; + +id: String; + +prompt: String?; + +rationale: String?; + <static>+keyConditional: String; + +conditional: QuestionConditional<V>? | - +Map<String, dynamic> toJson() + +Map<String, dynamic> toJson(); + +bool shouldBeShown(); + +Answer<V>? getDefaultAnswer(); + +Type getAnswerType(); + +String toString() ] - [Repo]o-[GitProvider] - [<abstract>SupabaseObjectFunctions]<:-[Repo] + [<abstract>Question]o-[QuestionConditional] - [GitProvider + [ChoiceQuestion | - +index: int; - <static>+values: List<GitProvider>; - <static>+gitlab: GitProvider + <static>+questionType: String; + +multiple: bool; + +choices: List<Choice> + | + +Map<String, dynamic> toJson(); + +Answer<List<String>> constructAnswer() ] - [GitProvider]o-[GitProvider] - [Enum]<:--[GitProvider] + [<abstract>Question]<:-[ChoiceQuestion] - [Study + [Choice | - <static>+tableName: String; - <static>+baselineID: String; +id: String; - +title: String?; - +description: String?; - +userId: String; - +participation: Participation; - +resultSharing: ResultSharing; - +contact: Contact; - +iconName: String; - +published: bool; - +questionnaire: StudyUQuestionnaire; - +eligibilityCriteria: List<EligibilityCriterion>; - +consent: List<ConsentItem>; - +interventions: List<Intervention>; - +observations: List<Observation>; - +schedule: StudySchedule; - +reportSpecification: ReportSpecification; - +results: List<StudyResult>; - +collaboratorEmails: List<String>; - +registryPublished: bool; - +participantCount: int; - +endedCount: int; - +activeSubjectCount: int; - +missedDays: List<int>; - +repo: Repo?; - +invites: List<StudyInvite>?; - +participants: List<StudySubject>?; - +participantsProgress: List<SubjectProgress>?; - +createdAt: DateTime?; - +primaryKeys: Map<String, dynamic>; - +hasEligibilityCheck: bool; - +hasConsentCheck: bool; - +totalMissedDays: int; - +percentageMissedDays: double; - +status: StudyStatus; - +isDraft: bool; - +isRunning: bool; - +isClosed: bool + +text: String | +Map<String, dynamic> toJson(); - <static>+dynamic getResearcherDashboardStudies(); - <static>+dynamic publishedPublicStudies(); - +bool isOwner(); - +bool isEditor(); - +bool canEdit(); - <static>+dynamic fetchResultsCSVTable(); - +bool isReadonly(); +String toString() ] - [Study]o-[Participation] - [Study]o-[ResultSharing] - [Study]o-[Contact] - [Study]o-[StudyUQuestionnaire] - [Study]o-[StudySchedule] - [Study]o-[ReportSpecification] - [Study]o-[Repo] - [Study]o-[StudyStatus] - [<abstract>SupabaseObjectFunctions]<:-[Study] - - [StudyStatus + [BooleanQuestion | - +index: int; - <static>+values: List<StudyStatus>; - <static>+draft: StudyStatus; - <static>+running: StudyStatus; - <static>+closed: StudyStatus - ] - - [StudyStatus]o-[StudyStatus] - [Enum]<:--[StudyStatus] - - [Participation + <static>+questionType: String | - +index: int; - <static>+values: List<Participation>; - <static>+open: Participation; - <static>+invite: Participation + +Map<String, dynamic> toJson(); + +Answer<bool> constructAnswer() ] - [Participation]o-[Participation] - [Enum]<:--[Participation] + [<abstract>Question]<:-[BooleanQuestion] - [ResultSharing + [<abstract>SliderQuestion | - +index: int; - <static>+values: List<ResultSharing>; - <static>+public: ResultSharing; - <static>+private: ResultSharing; - <static>+organization: ResultSharing + +minimum: double; + +maximum: double; + -_initial: double; + +step: double; + +initial: double + | + +Answer<num> constructAnswer() ] - [ResultSharing]o-[ResultSharing] - [Enum]<:--[ResultSharing] + [<abstract>Question]<:-[<abstract>SliderQuestion] - [LinearRegressionSection + [ScaleQuestion | - <static>+sectionType: String; - +resultProperty: DataReference<num>?; - +alpha: double; - +improvement: ImprovementDirection? + <static>+questionType: String; + +annotations: List<Annotation>; + +minColor: int?; + +maxColor: int?; + -_step: double; + +step: double; + +isAutostep: bool; + +autostep: int; + +annotationsSorted: List<Annotation>; + +minAnnotation: Annotation?; + +maxAnnotation: Annotation?; + +minLabel: String?; + +maxLabel: String?; + +midAnnotations: List<Annotation>; + +midLabels: List<String>; + +midValues: List<double>; + +values: List<double>; + +minimumAnnotation: String; + +maximumAnnotation: String; + +maximumColor: int; + +minimumColor: int | - +Map<String, dynamic> toJson() + +Map<String, dynamic> toJson(); + +Annotation addAnnotation(); + -void _setAnnotationLabel(); + <static>+int getAutostepSize(); + <static>+List<int> generateMidValues() ] - [LinearRegressionSection]o-[DataReference] - [LinearRegressionSection]o-[ImprovementDirection] - [<abstract>ReportSection]<:-[LinearRegressionSection] + [ScaleQuestion]o-[Annotation] + [<abstract>SliderQuestion]<:-[ScaleQuestion] + [AnnotatedScaleQuestion]<:--[ScaleQuestion] + [VisualAnalogueQuestion]<:--[ScaleQuestion] - [ImprovementDirection + [AnnotatedScaleQuestion | - +index: int; - <static>+values: List<ImprovementDirection>; - <static>+positive: ImprovementDirection; - <static>+negative: ImprovementDirection + <static>+questionType: String; + +annotations: List<Annotation> + | + +Map<String, dynamic> toJson() ] - [ImprovementDirection]o-[ImprovementDirection] - [Enum]<:--[ImprovementDirection] + [<abstract>SliderQuestion]<:-[AnnotatedScaleQuestion] - [AverageSection + [Annotation | - <static>+sectionType: String; - +aggregate: TemporalAggregation?; - +resultProperty: DataReference<num>? + +value: int; + +annotation: String | +Map<String, dynamic> toJson() ] - [AverageSection]o-[TemporalAggregation] - [AverageSection]o-[DataReference] - [<abstract>ReportSection]<:-[AverageSection] - - [TemporalAggregation + [VisualAnalogueQuestion | - +index: int; - <static>+values: List<TemporalAggregation>; - <static>+day: TemporalAggregation; - <static>+phase: TemporalAggregation; - <static>+intervention: TemporalAggregation + <static>+questionType: String; + +minimumColor: int; + +maximumColor: int; + +minimumAnnotation: String; + +maximumAnnotation: String + | + +Map<String, dynamic> toJson() ] - [TemporalAggregation]o-[TemporalAggregation] - [Enum]<:--[TemporalAggregation] + [<abstract>SliderQuestion]<:-[VisualAnalogueQuestion] - [ReportSpecification + [Answer | - +primary: ReportSection?; - +secondary: List<ReportSection> + +question: String; + +timestamp: DateTime; + <static>+keyResponse: String; + +response: V | +Map<String, dynamic> toJson(); + <static>+Answer<dynamic> fromJson(); +String toString() ] - [ReportSpecification]o-[<abstract>ReportSection] + [StudyUQuestionnaire + | + +questions: List<Question<dynamic>> + | + +List<dynamic> toJson() + ] - [<abstract>ReportSection + [EligibilityCriterion | - <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String; +id: String; - +title: String?; - +description: String? + +reason: String?; + +condition: Expression | +Map<String, dynamic> toJson(); - +String toString() + +bool isSatisfied(); + +bool isViolated() ] - [ConsentItem + [EligibilityCriterion]o-[<abstract>Expression] + + [StudySchedule | - +id: String; - +title: String?; - +description: String?; - +iconName: String + <static>+numberOfInterventions: int; + +numberOfCycles: int; + +phaseDuration: int; + +includeBaseline: bool; + +sequence: PhaseSequence; + +sequenceCustom: String; + +length: int; + +nameOfSequence: String | +Map<String, dynamic> toJson(); + +int getNumberOfPhases(); + +List<int> generateWith(); + -int _nextIntervention(); + -List<int> _generateCycle(); + -List<int> _generateAlternatingCycle(); + -List<int> _generateCounterBalancedCycle(); + -List<int> _generateRandomizedCycle(); + -List<int> _generateCustomizedCycle(); +String toString() ] - [Result + [StudySchedule]o-[PhaseSequence] + + [PhaseSequence | - <static>+keyType: String; - +type: String; - +periodId: String?; - <static>+keyResult: String; - +result: T + +index: int; + <static>+values: List<PhaseSequence>; + <static>+alternating: PhaseSequence; + <static>+counterBalanced: PhaseSequence; + <static>+randomized: PhaseSequence; + <static>+customized: PhaseSequence + ] + + [PhaseSequence]o-[PhaseSequence] + [Enum]<:--[PhaseSequence] + + [QuestionnaireTask + | + <static>+taskType: String; + +questions: StudyUQuestionnaire | +Map<String, dynamic> toJson(); - <static>-Result<dynamic> _fromJson() + +Map<DateTime, T> extractPropertyResults(); + +Map<String, Type> getAvailableProperties(); + +String? getHumanReadablePropertyName() + ] + + [QuestionnaireTask]o-[StudyUQuestionnaire] + [<abstract>Observation]<:-[QuestionnaireTask] + + [<abstract>Observation + | + <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> ] + [<abstract>Task]<:-[<abstract>Observation] + [Schedule | +completionPeriods: List<CompletionPeriod>; @@ -587,677 +485,995 @@ [<abstract>Task]o-[Schedule] - [Contact + [Result | - +organization: String; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String; - +website: String; - +phone: String; - +additionalInfo: String? + <static>+keyType: String; + +type: String; + +periodId: String?; + <static>+keyResult: String; + +result: T | +Map<String, dynamic> toJson(); - +String toString() + <static>-Result<dynamic> _fromJson() ] - [Answer + [Study | - +question: String; - +timestamp: DateTime; - <static>+keyResponse: String; - +response: V + <static>+tableName: String; + <static>+baselineID: String; + +id: String; + +title: String?; + +description: String?; + +userId: String; + +participation: Participation; + +resultSharing: ResultSharing; + +contact: Contact; + +iconName: String; + +published: bool; + +questionnaire: StudyUQuestionnaire; + +eligibilityCriteria: List<EligibilityCriterion>; + +consent: List<ConsentItem>; + +interventions: List<Intervention>; + +observations: List<Observation>; + +schedule: StudySchedule; + +reportSpecification: ReportSpecification; + +results: List<StudyResult>; + +collaboratorEmails: List<String>; + +registryPublished: bool; + +participantCount: int; + +endedCount: int; + +activeSubjectCount: int; + +missedDays: List<int>; + +repo: Repo?; + +invites: List<StudyInvite>?; + +participants: List<StudySubject>?; + +participantsProgress: List<SubjectProgress>?; + +createdAt: DateTime?; + +primaryKeys: Map<String, dynamic>; + +hasEligibilityCheck: bool; + +hasConsentCheck: bool; + +totalMissedDays: int; + +percentageMissedDays: double; + +status: StudyStatus; + +isDraft: bool; + +isRunning: bool; + +isClosed: bool | +Map<String, dynamic> toJson(); - <static>+Answer<dynamic> fromJson(); - +String toString() + <static>+dynamic getResearcherDashboardStudies(); + <static>+dynamic publishedPublicStudies(); + +bool isOwner(); + +bool isEditor(); + +bool canEdit(); + <static>+dynamic fetchResultsCSVTable(); + +bool isReadonly(); + +String toString(); + +int compareTo() ] - [QuestionConditional + [Study]o-[Participation] + [Study]o-[ResultSharing] + [Study]o-[Contact] + [Study]o-[StudyUQuestionnaire] + [Study]o-[StudySchedule] + [Study]o-[ReportSpecification] + [Study]o-[Repo] + [Study]o-[StudyStatus] + [<abstract>SupabaseObjectFunctions]<:-[Study] + [Comparable]<:--[Study] + + [StudyStatus + | + +index: int; + <static>+values: List<StudyStatus>; + <static>+draft: StudyStatus; + <static>+running: StudyStatus; + <static>+closed: StudyStatus + ] + + [StudyStatus]o-[StudyStatus] + [Enum]<:--[StudyStatus] + + [Participation + | + +index: int; + <static>+values: List<Participation>; + <static>+open: Participation; + <static>+invite: Participation + ] + + [Participation]o-[Participation] + [Enum]<:--[Participation] + + [ResultSharing + | + +index: int; + <static>+values: List<ResultSharing>; + <static>+public: ResultSharing; + <static>+private: ResultSharing; + <static>+organization: ResultSharing + ] + + [ResultSharing]o-[ResultSharing] + [Enum]<:--[ResultSharing] + + [AppConfig | - <static>+keyDefaultValue: String; - +defaultValue: V?; - +condition: Expression + <static>+tableName: String; + +id: String; + +contact: Contact; + +appPrivacy: Map<String, String>; + +appTerms: Map<String, String>; + +designerPrivacy: Map<String, String>; + +designerTerms: Map<String, String>; + +imprint: Map<String, String>; + +analytics: StudyUAnalytics; + +primaryKeys: Map<String, dynamic> | - <static>-QuestionConditional<V> _fromJson(); - +Map<String, dynamic> toJson() + +Map<String, dynamic> toJson(); + <static>+dynamic getAppConfig(); + <static>+dynamic getAppContact() ] - [QuestionConditional]o-[<abstract>Expression] + [AppConfig]o-[Contact] + [AppConfig]o-[StudyUAnalytics] + [<abstract>SupabaseObjectFunctions]<:-[AppConfig] - [StudyUQuestionnaire + [SubjectProgress | - +questions: List<Question<dynamic>> + <static>+tableName: String; + +completedAt: DateTime?; + +subjectId: String; + +interventionId: String; + +taskId: String; + +resultType: String; + +result: Result<dynamic>; + +startedAt: DateTime?; + +primaryKeys: Map<String, dynamic>; + +hashCode: int | - +List<dynamic> toJson() + +Map<String, dynamic> toJson(); + +SubjectProgress setStartDateBackBy(); + +bool ==() ] - [ChoiceQuestion + [SubjectProgress]o-[Result] + [<abstract>SupabaseObjectFunctions]<:-[SubjectProgress] + + [StudyInvite | - <static>+questionType: String; - +multiple: bool; - +choices: List<Choice> + <static>+tableName: String; + +code: String; + +studyId: String; + +preselectedInterventionIds: List<String>?; + +primaryKeys: Map<String, dynamic> | - +Map<String, dynamic> toJson(); - +Answer<List<String>> constructAnswer() + +Map<String, dynamic> toJson() ] - [<abstract>Question]<:-[ChoiceQuestion] + [<abstract>SupabaseObjectFunctions]<:-[StudyInvite] - [Choice + [StudyUUser | + <static>+tableName: String; +id: String; - +text: String + +email: String; + +preferences: Preferences; + +primaryKeys: Map<String, dynamic> | - +Map<String, dynamic> toJson(); - +String toString() + +Map<String, dynamic> toJson() ] - [<abstract>SliderQuestion + [StudyUUser]o-[Preferences] + [<abstract>SupabaseObjectFunctions]<:-[StudyUUser] + + [Preferences | - +minimum: double; - +maximum: double; - -_initial: double; - +step: double; - +initial: double + +language: String; + +pinnedStudies: Set<String> | - +Answer<num> constructAnswer() + +Map<String, dynamic> toJson() ] - [<abstract>Question]<:-[<abstract>SliderQuestion] - - [AnnotatedScaleQuestion + [Repo | - <static>+questionType: String; - +annotations: List<Annotation> + <static>+tableName: String; + +projectId: String; + +userId: String; + +studyId: String; + +provider: GitProvider; + +webUrl: String?; + +gitUrl: String?; + +primaryKeys: Map<String, dynamic> | +Map<String, dynamic> toJson() ] - [<abstract>SliderQuestion]<:-[AnnotatedScaleQuestion] + [Repo]o-[GitProvider] + [<abstract>SupabaseObjectFunctions]<:-[Repo] - [Annotation - | - +value: int; - +annotation: String + [GitProvider | - +Map<String, dynamic> toJson() + +index: int; + <static>+values: List<GitProvider>; + <static>+gitlab: GitProvider ] - [ScaleQuestion + [GitProvider]o-[GitProvider] + [Enum]<:--[GitProvider] + + [StudySubject | - <static>+questionType: String; - +annotations: List<Annotation>; - +minColor: int?; - +maxColor: int?; - -_step: double; - +step: double; - +isAutostep: bool; - +autostep: int; - +annotationsSorted: List<Annotation>; - +minAnnotation: Annotation?; - +maxAnnotation: Annotation?; - +minLabel: String?; - +maxLabel: String?; - +midAnnotations: List<Annotation>; - +midLabels: List<String>; - +midValues: List<double>; - +values: List<double>; - +minimumAnnotation: String; - +maximumAnnotation: String; - +maximumColor: int; - +minimumColor: int + <static>+tableName: String; + -_controller: StreamController<StudySubject>; + +id: String; + +studyId: String; + +userId: String; + +startedAt: DateTime?; + +selectedInterventionIds: List<String>; + +inviteCode: String?; + +isDeleted: bool; + +study: Study; + +progress: List<SubjectProgress>; + +primaryKeys: Map<String, dynamic>; + +interventionOrder: List<String>; + +selectedInterventions: List<Intervention>; + +daysPerIntervention: int; + +minimumStudyLengthCompleted: bool; + +completedStudy: bool; + +onSave: Stream<StudySubject>; + +hashCode: int | +Map<String, dynamic> toJson(); - +Annotation addAnnotation(); - -void _setAnnotationLabel(); - <static>+int getAutostepSize(); - <static>+List<int> generateMidValues() + +dynamic addResult(); + +Map<DateTime, List<SubjectProgress>> getResultsByDate(); + +DateTime endDate(); + +int getDayOfStudyFor(); + +int getInterventionIndexForDate(); + +Intervention? getInterventionForDate(); + +List<Intervention> getInterventionsInOrder(); + +DateTime startOfPhase(); + +DateTime dayAfterEndOfPhase(); + +List<SubjectProgress> resultsFor(); + +int completedForPhase(); + +int daysLeftForPhase(); + +double percentCompletedForPhase(); + +double percentMissedForPhase(); + +List<SubjectProgress> getTaskProgressForDay(); + +bool completedTaskInstanceForDay(); + +bool completedTaskForDay(); + +int completedTasksFor(); + +bool allTasksCompletedFor(); + +int totalTaskCountFor(); + +List<TaskInstance> scheduleFor(); + +dynamic setStartDateBackBy(); + +dynamic save(); + +Map<String, dynamic> toFullJson(); + +dynamic deleteProgress(); + +dynamic delete(); + +dynamic softDelete(); + <static>+dynamic getStudyHistory(); + +bool ==(); + +String toString() ] - [ScaleQuestion]o-[Annotation] - [<abstract>SliderQuestion]<:-[ScaleQuestion] - [AnnotatedScaleQuestion]<:--[ScaleQuestion] - [VisualAnalogueQuestion]<:--[ScaleQuestion] + [StudySubject]o-[StreamController] + [StudySubject]o-[Study] + [StudySubject]o-[Stream] + [<abstract>SupabaseObjectFunctions]<:-[StudySubject] - [VisualAnalogueQuestion - | - <static>+questionType: String; - +minimumColor: int; - +maximumColor: int; - +minimumAnnotation: String; - +maximumAnnotation: String + [<abstract>InterventionTask | - +Map<String, dynamic> toJson() + <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> ] - [<abstract>SliderQuestion]<:-[VisualAnalogueQuestion] + [<abstract>Task]<:-[<abstract>InterventionTask] - [BooleanQuestion + [Intervention | - <static>+questionType: String + +id: String; + +name: String?; + +description: String?; + +icon: String; + +tasks: List<InterventionTask> | +Map<String, dynamic> toJson(); - +Answer<bool> constructAnswer() + +bool isBaseline() ] - [<abstract>Question]<:-[BooleanQuestion] - - [<abstract>Question + [CheckmarkTask | - <static>+questionTypes: Map<String, Question<dynamic> Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String; - +id: String; - +prompt: String?; - +rationale: String?; - <static>+keyConditional: String; - +conditional: QuestionConditional<V>? + <static>+taskType: String | +Map<String, dynamic> toJson(); - +bool shouldBeShown(); - +Answer<V>? getDefaultAnswer(); - +Type getAnswerType(); - +String toString() + +Map<DateTime, T> extractPropertyResults(); + +Map<String, Type> getAvailableProperties(); + +String? getHumanReadablePropertyName() ] - [<abstract>Question]o-[QuestionConditional] + [<abstract>InterventionTask]<:-[CheckmarkTask] - [EligibilityCriterion + [Contact | - +id: String; - +reason: String?; - +condition: Expression + +organization: String; + +institutionalReviewBoard: String?; + +institutionalReviewBoardNumber: String?; + +researchers: String?; + +email: String; + +website: String; + +phone: String; + +additionalInfo: String? | +Map<String, dynamic> toJson(); - +bool isSatisfied(); - +bool isViolated() + +String toString() ] - [EligibilityCriterion]o-[<abstract>Expression] - - [QuestionnaireTask + [<abstract>SupabaseObject | - <static>+taskType: String; - +questions: StudyUQuestionnaire + +primaryKeys: Map<String, dynamic> + | + +Map<String, dynamic> toJson() + ] + + [<abstract>SupabaseObjectFunctions | - +Map<String, dynamic> toJson(); - +Map<DateTime, T> extractPropertyResults(); - +Map<String, Type> getAvailableProperties(); - +String? getHumanReadablePropertyName() + <static>+T fromJson(); + +dynamic delete(); + +dynamic save() ] - [QuestionnaireTask]o-[StudyUQuestionnaire] - [<abstract>Observation]<:-[QuestionnaireTask] + [<abstract>SupabaseObject]<:--[<abstract>SupabaseObjectFunctions] - [<abstract>Observation + [SupabaseQuery | - <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> + <static>+dynamic getAll(); + <static>+dynamic getById(); + <static>+dynamic batchUpsert(); + <static>+List<T> extractSupabaseList(); + <static>+T extractSupabaseSingleRow(); + <static>+void catchSupabaseException() ] - [<abstract>Task]<:-[<abstract>Observation] - - [StudySchedule + [Analytics | - <static>+numberOfInterventions: int; - +numberOfCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +sequence: PhaseSequence; - +sequenceCustom: String; - +length: int; - +nameOfSequence: String + <static>+logger: Logger; + <static>+onLog: StreamSubscription<LogRecord> | - +Map<String, dynamic> toJson(); - +int getNumberOfPhases(); - +List<int> generateWith(); - -int _nextIntervention(); - -List<int> _generateCycle(); - -List<int> _generateAlternatingCycle(); - -List<int> _generateCounterBalancedCycle(); - -List<int> _generateRandomizedCycle(); - -List<int> _generateCustomizedCycle(); - +String toString() + <static>+void init(); + <static>+void dispose(); + <static>+dynamic captureEvent(); + <static>+dynamic captureException(); + <static>+dynamic captureMessage(); + <static>+void addBreadcrumb() ] - [StudySchedule]o-[PhaseSequence] + [Analytics]o-[Logger] + [Analytics]o-[StreamSubscription] - [PhaseSequence + [StudyUAnalytics | - +index: int; - <static>+values: List<PhaseSequence>; - <static>+alternating: PhaseSequence; - <static>+counterBalanced: PhaseSequence; - <static>+randomized: PhaseSequence; - <static>+customized: PhaseSequence + +enabled: bool; + +dsn: String; + +samplingRate: double?; + <static>+keyStudyUAnalytics: String + | + +Map<String, dynamic> toJson() ] - [PhaseSequence]o-[PhaseSequence] - [Enum]<:--[PhaseSequence] - - + - + - - - - - - + + - + - + - + - + + + - - - - - - - - - - - - - - - - - - - + - - - - - + - + - - - + + + - + - - - + + - + + - + + + + - - - + + - + - + + + + + + + + + + + + + + + - + - - - + + + - + - - - + - + + + + + + + + + + + + + - + - - + + + + + + + + + + - + - + - + - + - + - - - + + - + + - + - + + + + + - + - + - + - + - + - - - + - + - - + + + - - + - + - - + + + - - + - + - - + + + - - + - + - + - + - - - + - + + + - + - - + + - + - - - + + - - - + + - + - + - - + + - + - + + + + + - + - + - + - + + + - + - + + + + + - + - + + + - - - - - - - - - + + + + + - + - - - + - - - - - - - - - - + + - + - + - + - + - + + + + + + + + + + - - - - - + + - + - + - + - - + + + + + + + + + DataReference + + + + + + +task: String + +property: String + + + + + + +Map<String, dynamic> toJson() + +String toString() + +Map<DateTime, T> retrieveFromResults() + + + - - - - - - + + + + + - - - SupabaseObject + + + AverageSection - - - +primaryKeys: Map<String, dynamic> + + + <static>+sectionType: String + +aggregate: TemporalAggregation? + +resultProperty: DataReference<num>? - - - +Map<String, dynamic> toJson() + + + +Map<String, dynamic> toJson() - - - - + + + + + + + + TemporalAggregation + + + + + + +index: int + <static>+values: List<TemporalAggregation> + <static>+day: TemporalAggregation + <static>+phase: TemporalAggregation + <static>+intervention: TemporalAggregation + + + + + + + + + + + + + ReportSection + + + + + + <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)> + <static>+keyType: String + +type: String + +id: String + +title: String? + +description: String? + + + + + + +Map<String, dynamic> toJson() + +String toString() + + + + + + + + + + + + + LinearRegressionSection + + + + + + <static>+sectionType: String + +resultProperty: DataReference<num>? + +alpha: double + +improvement: ImprovementDirection? + + + + + + +Map<String, dynamic> toJson() + + + + + + + + + + + + ImprovementDirection + + + + + + +index: int + <static>+values: List<ImprovementDirection> + <static>+positive: ImprovementDirection + <static>+negative: ImprovementDirection + + + + + + + + + + + Enum + + + + + + + + + + + + + ReportSpecification + + + + + + +primary: ReportSection? + +secondary: List<ReportSection> + + + + + + +Map<String, dynamic> toJson() + +String toString() + + + + + + + + + + + + + NotExpression + + - - - SupabaseObjectFunctions + + + <static>+expressionType: String + +expression: Expression - - - <static>+T fromJson() - +dynamic delete() - +dynamic save() + + + +Map<String, dynamic> toJson() + +bool? evaluate() - - - - + + + + + - - - SupabaseQuery + + + Expression - - - <static>+dynamic getAll() - <static>+dynamic getById() - <static>+dynamic batchUpsert() - <static>+List<T> extractSupabaseList() - <static>+T extractSupabaseSingleRow() - <static>+void catchSupabaseException() + + + <static>+expressionTypes: Map<String, Expression Function(Map<String, dynamic>)> + <static>+keyType: String + +type: String? + + + + + + +Map<String, dynamic> toJson() + +String toString() + +bool? evaluate() - - - - - + + + + + - - - Analytics + + + BooleanExpression - - - <static>+logger: Logger - <static>+onLog: StreamSubscription<LogRecord> + + + <static>+expressionType: String - - - <static>+void init() - <static>+void dispose() - <static>+dynamic captureEvent() - <static>+dynamic captureException() - <static>+dynamic captureMessage() - <static>+void addBreadcrumb() + + + +Map<String, dynamic> toJson() + +bool checkValue() - - - + + + + + - - - Logger + + + ValueExpression - - - - + + + <static>+expressionType: String + +target: String? + + - - - StreamSubscription + + + +bool checkValue() + +bool? evaluate() - - - - - + + + + + - - - StudyUAnalytics + + + ChoiceExpression - - - +enabled: bool - +dsn: String - +samplingRate: double? - <static>+keyStudyUAnalytics: String + + + <static>+expressionType: String + +choices: Set<dynamic> - - - +Map<String, dynamic> toJson() + + + +Map<String, dynamic> toJson() + +bool checkValue() - - - + + + - + StudyResult - + <static>+studyResultTypes: Map<String, StudyResult Function(Map<String, dynamic>)> <static>+keyType: String @@ -1267,7 +1483,7 @@ - + +Map<String, dynamic> toJson() +List<String> getHeaders() @@ -1276,81 +1492,25 @@ - - - - - - - - - NumericResult - - - - - - <static>+studyResultType: String - +resultProperty: DataReference<num> - - - - - - +Map<String, dynamic> toJson() - +List<String> getHeaders() - +List<dynamic> getValues() - - - - - - - - - - - - - DataReference - - - - - - +task: String - +property: String - - - - - - +Map<String, dynamic> toJson() - +String toString() - +Map<DateTime, T> retrieveFromResults() - - - - - - - + + + - + InterventionResult - + <static>+studyResultType: String - + +Map<String, dynamic> toJson() +List<String> getHeaders() @@ -1359,1504 +1519,1445 @@ - - - - - - - - InterventionTask - - - - - - <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> - - - - - - - - - + + + + + - - - Task + + + NumericResult - - - <static>+keyType: String - +type: String - +id: String - +title: String? - +header: String? - +footer: String? - +schedule: Schedule + + + <static>+studyResultType: String + +resultProperty: DataReference<num> - - - +Map<String, dynamic> toJson() - +String toString() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() + + + +Map<String, dynamic> toJson() + +List<String> getHeaders() + +List<dynamic> getValues() - - - - - + + + + + - - - Intervention + + + ConsentItem - - - +id: String - +name: String? - +description: String? - +icon: String - +tasks: List<InterventionTask> + + + +id: String + +title: String? + +description: String? + +iconName: String - - - +Map<String, dynamic> toJson() - +bool isBaseline() + + + +Map<String, dynamic> toJson() + +String toString() - - - - - + + + + + - - - CheckmarkTask + + + QuestionConditional - - - <static>+taskType: String + + + <static>+keyDefaultValue: String + +defaultValue: V? + +condition: Expression - - - +Map<String, dynamic> toJson() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() + + + <static>-QuestionConditional<V> _fromJson() + +Map<String, dynamic> toJson() - - - - - + + + + + - - - ValueExpression + + + Question - - - <static>+expressionType: String - +target: String? + + + <static>+questionTypes: Map<String, Question<dynamic> Function(Map<String, dynamic>)> + <static>+keyType: String + +type: String + +id: String + +prompt: String? + +rationale: String? + <static>+keyConditional: String + +conditional: QuestionConditional<V>? - - - +bool checkValue() - +bool? evaluate() + + + +Map<String, dynamic> toJson() + +bool shouldBeShown() + +Answer<V>? getDefaultAnswer() + +Type getAnswerType() + +String toString() - - - - - + + + + + - - - Expression + + + ChoiceQuestion - - - <static>+expressionTypes: Map<String, Expression Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String? + + + <static>+questionType: String + +multiple: bool + +choices: List<Choice> - - - +Map<String, dynamic> toJson() - +String toString() - +bool? evaluate() + + + +Map<String, dynamic> toJson() + +Answer<List<String>> constructAnswer() - - - - - + + + + + - - - BooleanExpression + + + Choice - - - <static>+expressionType: String + + + +id: String + +text: String - - - +Map<String, dynamic> toJson() - +bool checkValue() + + + +Map<String, dynamic> toJson() + +String toString() - - - - - + + + + + - - - ChoiceExpression + + + BooleanQuestion - - - <static>+expressionType: String - +choices: Set<dynamic> + + + <static>+questionType: String - - - +Map<String, dynamic> toJson() - +bool checkValue() + + + +Map<String, dynamic> toJson() + +Answer<bool> constructAnswer() - - - - - + + + + + - - - NotExpression + + + SliderQuestion - - - <static>+expressionType: String - +expression: Expression + + + +minimum: double + +maximum: double + -_initial: double + +step: double + +initial: double - - - +Map<String, dynamic> toJson() - +bool? evaluate() + + + +Answer<num> constructAnswer() - - - - - + + + + + - - - StudyInvite + + + ScaleQuestion - - - <static>+tableName: String - +code: String - +studyId: String - +preselectedInterventionIds: List<String>? - +primaryKeys: Map<String, dynamic> + + + <static>+questionType: String + +annotations: List<Annotation> + +minColor: int? + +maxColor: int? + -_step: double + +step: double + +isAutostep: bool + +autostep: int + +annotationsSorted: List<Annotation> + +minAnnotation: Annotation? + +maxAnnotation: Annotation? + +minLabel: String? + +maxLabel: String? + +midAnnotations: List<Annotation> + +midLabels: List<String> + +midValues: List<double> + +values: List<double> + +minimumAnnotation: String + +maximumAnnotation: String + +maximumColor: int + +minimumColor: int - - - +Map<String, dynamic> toJson() + + + +Map<String, dynamic> toJson() + +Annotation addAnnotation() + -void _setAnnotationLabel() + <static>+int getAutostepSize() + <static>+List<int> generateMidValues() - - - - - + + + + + - - - SubjectProgress + + + Annotation - - - <static>+tableName: String - +completedAt: DateTime? - +subjectId: String - +interventionId: String - +taskId: String - +resultType: String - +result: Result<dynamic> - +startedAt: DateTime? - +primaryKeys: Map<String, dynamic> - +hashCode: int + + + +value: int + +annotation: String - - - +Map<String, dynamic> toJson() - +SubjectProgress setStartDateBackBy() - +bool ==() + + + +Map<String, dynamic> toJson() - - - - - + + + + + - - - Result + + + AnnotatedScaleQuestion - - - <static>+keyType: String - +type: String - +periodId: String? - <static>+keyResult: String - +result: T + + + <static>+questionType: String + +annotations: List<Annotation> - - - +Map<String, dynamic> toJson() - <static>-Result<dynamic> _fromJson() + + + +Map<String, dynamic> toJson() - - - - - + + + + + - - - StudySubject + + + VisualAnalogueQuestion - - - <static>+tableName: String - -_controller: StreamController<StudySubject> - +id: String - +studyId: String - +userId: String - +startedAt: DateTime? - +selectedInterventionIds: List<String> - +inviteCode: String? - +isDeleted: bool - +study: Study - +progress: List<SubjectProgress> - +primaryKeys: Map<String, dynamic> - +interventionOrder: List<String> - +selectedInterventions: List<Intervention> - +daysPerIntervention: int - +minimumStudyLengthCompleted: bool - +completedStudy: bool - +onSave: Stream<StudySubject> - +hashCode: int + + + <static>+questionType: String + +minimumColor: int + +maximumColor: int + +minimumAnnotation: String + +maximumAnnotation: String - - - +Map<String, dynamic> toJson() - +dynamic addResult() - +Map<DateTime, List<SubjectProgress>> getResultsByDate() - +DateTime endDate() - +int getDayOfStudyFor() - +int getInterventionIndexForDate() - +Intervention? getInterventionForDate() - +List<Intervention> getInterventionsInOrder() - +DateTime startOfPhase() - +DateTime dayAfterEndOfPhase() - +List<SubjectProgress> resultsFor() - +int completedForPhase() - +int daysLeftForPhase() - +double percentCompletedForPhase() - +double percentMissedForPhase() - +List<SubjectProgress> getTaskProgressForDay() - +bool completedTaskInstanceForDay() - +bool completedTaskForDay() - +int completedTasksFor() - +bool allTasksCompletedFor() - +int totalTaskCountFor() - +List<TaskInstance> scheduleFor() - +dynamic setStartDateBackBy() - +dynamic save() - +Map<String, dynamic> toFullJson() - +dynamic deleteProgress() - +dynamic delete() - +dynamic softDelete() - <static>+dynamic getStudyHistory() - +bool ==() - +String toString() + + + +Map<String, dynamic> toJson() - - - + + + + + - - - StreamController + + + Answer - - - - - - - - - - Study + + + +question: String + +timestamp: DateTime + <static>+keyResponse: String + +response: V - - - <static>+tableName: String - <static>+baselineID: String - +id: String - +title: String? - +description: String? - +userId: String - +participation: Participation - +resultSharing: ResultSharing - +contact: Contact - +iconName: String - +published: bool - +questionnaire: StudyUQuestionnaire - +eligibilityCriteria: List<EligibilityCriterion> - +consent: List<ConsentItem> - +interventions: List<Intervention> - +observations: List<Observation> - +schedule: StudySchedule - +reportSpecification: ReportSpecification - +results: List<StudyResult> - +collaboratorEmails: List<String> - +registryPublished: bool - +participantCount: int - +endedCount: int - +activeSubjectCount: int - +missedDays: List<int> - +repo: Repo? - +invites: List<StudyInvite>? - +participants: List<StudySubject>? - +participantsProgress: List<SubjectProgress>? - +createdAt: DateTime? - +primaryKeys: Map<String, dynamic> - +hasEligibilityCheck: bool - +hasConsentCheck: bool - +totalMissedDays: int - +percentageMissedDays: double - +status: StudyStatus - +isDraft: bool - +isRunning: bool - +isClosed: bool + + + +Map<String, dynamic> toJson() + <static>+Answer<dynamic> fromJson() + +String toString() - - - +Map<String, dynamic> toJson() - <static>+dynamic getResearcherDashboardStudies() - <static>+dynamic publishedPublicStudies() - +bool isOwner() - +bool isEditor() - +bool canEdit() - <static>+dynamic fetchResultsCSVTable() - +bool isReadonly() - +String toString() + + + + + + + + + + StudyUQuestionnaire - - - - + + + +questions: List<Question<dynamic>> + + - - - Stream + + + +List<dynamic> toJson() - - - - - + + + + + - - - AppConfig + + + EligibilityCriterion - - - <static>+tableName: String - +id: String - +contact: Contact - +appPrivacy: Map<String, String> - +appTerms: Map<String, String> - +designerPrivacy: Map<String, String> - +designerTerms: Map<String, String> - +imprint: Map<String, String> - +analytics: StudyUAnalytics - +primaryKeys: Map<String, dynamic> + + + +id: String + +reason: String? + +condition: Expression - - - +Map<String, dynamic> toJson() - <static>+dynamic getAppConfig() - <static>+dynamic getAppContact() + + + +Map<String, dynamic> toJson() + +bool isSatisfied() + +bool isViolated() - - - - - + + + + + - - - Contact + + + StudySchedule - - - +organization: String - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String - +website: String - +phone: String - +additionalInfo: String? + + + <static>+numberOfInterventions: int + +numberOfCycles: int + +phaseDuration: int + +includeBaseline: bool + +sequence: PhaseSequence + +sequenceCustom: String + +length: int + +nameOfSequence: String - - - +Map<String, dynamic> toJson() - +String toString() + + + +Map<String, dynamic> toJson() + +int getNumberOfPhases() + +List<int> generateWith() + -int _nextIntervention() + -List<int> _generateCycle() + -List<int> _generateAlternatingCycle() + -List<int> _generateCounterBalancedCycle() + -List<int> _generateRandomizedCycle() + -List<int> _generateCustomizedCycle() + +String toString() - - - - - - - - - Repo - - + + + + - - - <static>+tableName: String - +projectId: String - +userId: String - +studyId: String - +provider: GitProvider - +webUrl: String - +gitUrl: String - +primaryKeys: Map<String, dynamic> + + + PhaseSequence - - - +Map<String, dynamic> toJson() + + + +index: int + <static>+values: List<PhaseSequence> + <static>+alternating: PhaseSequence + <static>+counterBalanced: PhaseSequence + <static>+randomized: PhaseSequence + <static>+customized: PhaseSequence - - - - + + + + + - - - GitProvider + + + QuestionnaireTask - - - +index: int - <static>+values: List<GitProvider> - <static>+gitlab: GitProvider + + + <static>+taskType: String + +questions: StudyUQuestionnaire - - - - - - - - Enum + + + +Map<String, dynamic> toJson() + +Map<DateTime, T> extractPropertyResults() + +Map<String, Type> getAvailableProperties() + +String? getHumanReadablePropertyName() - - - - + + + + - - - Participation + + + Observation - - - +index: int - <static>+values: List<Participation> - <static>+open: Participation - <static>+invite: Participation + + + <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> - - - - + + + + + - - - ResultSharing + + + Task - - - +index: int - <static>+values: List<ResultSharing> - <static>+public: ResultSharing - <static>+private: ResultSharing - <static>+organization: ResultSharing + + + <static>+keyType: String + +type: String + +id: String + +title: String? + +header: String? + +footer: String? + +schedule: Schedule + + + + + + +Map<String, dynamic> toJson() + +String toString() + +Map<DateTime, T> extractPropertyResults() + +Map<String, Type> getAvailableProperties() + +String? getHumanReadablePropertyName() - - - - - + + + + + - - - StudyUQuestionnaire + + + Schedule - - - +questions: List<Question<dynamic>> + + + +completionPeriods: List<CompletionPeriod> + +reminders: List<StudyUTimeOfDay> - - - +List<dynamic> toJson() + + + +Map<String, dynamic> toJson() + +String toString() - - - - - + + + + + - - - StudySchedule + + + CompletionPeriod - - - <static>+numberOfInterventions: int - +numberOfCycles: int - +phaseDuration: int - +includeBaseline: bool - +sequence: PhaseSequence - +sequenceCustom: String - +length: int - +nameOfSequence: String + + + +id: String + +unlockTime: StudyUTimeOfDay + +lockTime: StudyUTimeOfDay - - - +Map<String, dynamic> toJson() - +int getNumberOfPhases() - +List<int> generateWith() - -int _nextIntervention() - -List<int> _generateCycle() - -List<int> _generateAlternatingCycle() - -List<int> _generateCounterBalancedCycle() - -List<int> _generateRandomizedCycle() - -List<int> _generateCustomizedCycle() - +String toString() + + + +Map<String, dynamic> toJson() + +String formatted() + +String toString() + +bool contains() - - - - - + + + + + - - - ReportSpecification + + + StudyUTimeOfDay - - - +primary: ReportSection? - +secondary: List<ReportSection> + + + +hour: int + +minute: int - - - +Map<String, dynamic> toJson() - +String toString() + + + +String toJson() + +String toString() + +bool earlierThan() - - - - + + + + + - - - StudyStatus + + + TaskInstance - - - +index: int - <static>+values: List<StudyStatus> - <static>+draft: StudyStatus - <static>+running: StudyStatus - <static>+closed: StudyStatus + + + +task: Task + +id: String + +completionPeriod: CompletionPeriod - - - - - - - - - - LinearRegressionSection + + + <static>-Task _taskFromStudy() + <static>-Task _taskFromSubject() - - - <static>+sectionType: String - +resultProperty: DataReference<num>? - +alpha: double - +improvement: ImprovementDirection? - - + + + + + + - - - +Map<String, dynamic> toJson() + + + Result - - - - - - - - - ImprovementDirection + + + <static>+keyType: String + +type: String + +periodId: String? + <static>+keyResult: String + +result: T - - - +index: int - <static>+values: List<ImprovementDirection> - <static>+positive: ImprovementDirection - <static>+negative: ImprovementDirection + + + +Map<String, dynamic> toJson() + <static>-Result<dynamic> _fromJson() - - - - - + + + + + - - - ReportSection + + + Study - - - <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String - +id: String - +title: String? - +description: String? + + + <static>+tableName: String + <static>+baselineID: String + +id: String + +title: String? + +description: String? + +userId: String + +participation: Participation + +resultSharing: ResultSharing + +contact: Contact + +iconName: String + +published: bool + +questionnaire: StudyUQuestionnaire + +eligibilityCriteria: List<EligibilityCriterion> + +consent: List<ConsentItem> + +interventions: List<Intervention> + +observations: List<Observation> + +schedule: StudySchedule + +reportSpecification: ReportSpecification + +results: List<StudyResult> + +collaboratorEmails: List<String> + +registryPublished: bool + +participantCount: int + +endedCount: int + +activeSubjectCount: int + +missedDays: List<int> + +repo: Repo? + +invites: List<StudyInvite>? + +participants: List<StudySubject>? + +participantsProgress: List<SubjectProgress>? + +createdAt: DateTime? + +primaryKeys: Map<String, dynamic> + +hasEligibilityCheck: bool + +hasConsentCheck: bool + +totalMissedDays: int + +percentageMissedDays: double + +status: StudyStatus + +isDraft: bool + +isRunning: bool + +isClosed: bool - - - +Map<String, dynamic> toJson() - +String toString() + + + +Map<String, dynamic> toJson() + <static>+dynamic getResearcherDashboardStudies() + <static>+dynamic publishedPublicStudies() + +bool isOwner() + +bool isEditor() + +bool canEdit() + <static>+dynamic fetchResultsCSVTable() + +bool isReadonly() + +String toString() + +int compareTo() - - - - - - - - - AverageSection - - + + + + - - - <static>+sectionType: String - +aggregate: TemporalAggregation? - +resultProperty: DataReference<num>? + + + Participation - - - +Map<String, dynamic> toJson() + + + +index: int + <static>+values: List<Participation> + <static>+open: Participation + <static>+invite: Participation - - - - + + + + - - - TemporalAggregation + + + ResultSharing - - - +index: int - <static>+values: List<TemporalAggregation> - <static>+day: TemporalAggregation - <static>+phase: TemporalAggregation - <static>+intervention: TemporalAggregation + + + +index: int + <static>+values: List<ResultSharing> + <static>+public: ResultSharing + <static>+private: ResultSharing + <static>+organization: ResultSharing - - - - - + + + + + - - - ConsentItem + + + Contact - - - +id: String - +title: String? - +description: String? - +iconName: String + + + +organization: String + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String + +website: String + +phone: String + +additionalInfo: String? - - - +Map<String, dynamic> toJson() - +String toString() + + + +Map<String, dynamic> toJson() + +String toString() - - - - - + + + + + - - - Schedule + + + Repo - - - +completionPeriods: List<CompletionPeriod> - +reminders: List<StudyUTimeOfDay> + + + <static>+tableName: String + +projectId: String + +userId: String + +studyId: String + +provider: GitProvider + +webUrl: String? + +gitUrl: String? + +primaryKeys: Map<String, dynamic> - - - +Map<String, dynamic> toJson() - +String toString() + + + +Map<String, dynamic> toJson() - - - - - - - - - CompletionPeriod - - + + + + - - - +id: String - +unlockTime: StudyUTimeOfDay - +lockTime: StudyUTimeOfDay + + + StudyStatus - - - +Map<String, dynamic> toJson() - +String formatted() - +String toString() - +bool contains() + + + +index: int + <static>+values: List<StudyStatus> + <static>+draft: StudyStatus + <static>+running: StudyStatus + <static>+closed: StudyStatus - - - - - + + + + - - - StudyUTimeOfDay + + + SupabaseObjectFunctions - - - +hour: int - +minute: int + + + <static>+T fromJson() + +dynamic delete() + +dynamic save() - - - +String toJson() - +String toString() - +bool earlierThan() + + + + + + + + Comparable - - - - - + + + + + - - - TaskInstance + + + AppConfig - - - +task: Task - +id: String - +completionPeriod: CompletionPeriod + + + <static>+tableName: String + +id: String + +contact: Contact + +appPrivacy: Map<String, String> + +appTerms: Map<String, String> + +designerPrivacy: Map<String, String> + +designerTerms: Map<String, String> + +imprint: Map<String, String> + +analytics: StudyUAnalytics + +primaryKeys: Map<String, dynamic> - - - <static>-Task _taskFromStudy() - <static>-Task _taskFromSubject() + + + +Map<String, dynamic> toJson() + <static>+dynamic getAppConfig() + <static>+dynamic getAppContact() - - - - - + + + + + - - - Answer + + + StudyUAnalytics - - - +question: String - +timestamp: DateTime - <static>+keyResponse: String - +response: V + + + +enabled: bool + +dsn: String + +samplingRate: double? + <static>+keyStudyUAnalytics: String - - - +Map<String, dynamic> toJson() - <static>+Answer<dynamic> fromJson() - +String toString() + + + +Map<String, dynamic> toJson() - - - - - + + + + + - - - QuestionConditional + + + SubjectProgress - - - <static>+keyDefaultValue: String - +defaultValue: V? - +condition: Expression + + + <static>+tableName: String + +completedAt: DateTime? + +subjectId: String + +interventionId: String + +taskId: String + +resultType: String + +result: Result<dynamic> + +startedAt: DateTime? + +primaryKeys: Map<String, dynamic> + +hashCode: int - - - <static>-QuestionConditional<V> _fromJson() - +Map<String, dynamic> toJson() + + + +Map<String, dynamic> toJson() + +SubjectProgress setStartDateBackBy() + +bool ==() - - - - - + + + + + - - - ChoiceQuestion + + + StudyInvite - - - <static>+questionType: String - +multiple: bool - +choices: List<Choice> + + + <static>+tableName: String + +code: String + +studyId: String + +preselectedInterventionIds: List<String>? + +primaryKeys: Map<String, dynamic> - - - +Map<String, dynamic> toJson() - +Answer<List<String>> constructAnswer() + + + +Map<String, dynamic> toJson() - - - - - + + + + + - - - Question + + + StudyUUser - - - <static>+questionTypes: Map<String, Question<dynamic> Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String - +id: String - +prompt: String? - +rationale: String? - <static>+keyConditional: String - +conditional: QuestionConditional<V>? + + + <static>+tableName: String + +id: String + +email: String + +preferences: Preferences + +primaryKeys: Map<String, dynamic> - - - +Map<String, dynamic> toJson() - +bool shouldBeShown() - +Answer<V>? getDefaultAnswer() - +Type getAnswerType() - +String toString() + + + +Map<String, dynamic> toJson() - - - - - + + + + + - - - Choice + + + Preferences - - - +id: String - +text: String + + + +language: String + +pinnedStudies: Set<String> - - - +Map<String, dynamic> toJson() - +String toString() + + + +Map<String, dynamic> toJson() - - - - - - - - - SliderQuestion - - + + + + - - - +minimum: double - +maximum: double - -_initial: double - +step: double - +initial: double + + + GitProvider - - - +Answer<num> constructAnswer() + + + +index: int + <static>+values: List<GitProvider> + <static>+gitlab: GitProvider - - - - - + + + + + - - - AnnotatedScaleQuestion + + + StudySubject - - - <static>+questionType: String - +annotations: List<Annotation> + + + <static>+tableName: String + -_controller: StreamController<StudySubject> + +id: String + +studyId: String + +userId: String + +startedAt: DateTime? + +selectedInterventionIds: List<String> + +inviteCode: String? + +isDeleted: bool + +study: Study + +progress: List<SubjectProgress> + +primaryKeys: Map<String, dynamic> + +interventionOrder: List<String> + +selectedInterventions: List<Intervention> + +daysPerIntervention: int + +minimumStudyLengthCompleted: bool + +completedStudy: bool + +onSave: Stream<StudySubject> + +hashCode: int - - - +Map<String, dynamic> toJson() + + + +Map<String, dynamic> toJson() + +dynamic addResult() + +Map<DateTime, List<SubjectProgress>> getResultsByDate() + +DateTime endDate() + +int getDayOfStudyFor() + +int getInterventionIndexForDate() + +Intervention? getInterventionForDate() + +List<Intervention> getInterventionsInOrder() + +DateTime startOfPhase() + +DateTime dayAfterEndOfPhase() + +List<SubjectProgress> resultsFor() + +int completedForPhase() + +int daysLeftForPhase() + +double percentCompletedForPhase() + +double percentMissedForPhase() + +List<SubjectProgress> getTaskProgressForDay() + +bool completedTaskInstanceForDay() + +bool completedTaskForDay() + +int completedTasksFor() + +bool allTasksCompletedFor() + +int totalTaskCountFor() + +List<TaskInstance> scheduleFor() + +dynamic setStartDateBackBy() + +dynamic save() + +Map<String, dynamic> toFullJson() + +dynamic deleteProgress() + +dynamic delete() + +dynamic softDelete() + <static>+dynamic getStudyHistory() + +bool ==() + +String toString() - - - - - + + + - - - Annotation + + + StreamController - - - +value: int - +annotation: String - - + + + + - - - +Map<String, dynamic> toJson() + + + Stream - - - - - - - - - ScaleQuestion - - + + + + - - - <static>+questionType: String - +annotations: List<Annotation> - +minColor: int? - +maxColor: int? - -_step: double - +step: double - +isAutostep: bool - +autostep: int - +annotationsSorted: List<Annotation> - +minAnnotation: Annotation? - +maxAnnotation: Annotation? - +minLabel: String? - +maxLabel: String? - +midAnnotations: List<Annotation> - +midLabels: List<String> - +midValues: List<double> - +values: List<double> - +minimumAnnotation: String - +maximumAnnotation: String - +maximumColor: int - +minimumColor: int + + + InterventionTask - - - +Map<String, dynamic> toJson() - +Annotation addAnnotation() - -void _setAnnotationLabel() - <static>+int getAutostepSize() - <static>+List<int> generateMidValues() + + + <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> - - - - - + + + + + - - - VisualAnalogueQuestion + + + Intervention - - - <static>+questionType: String - +minimumColor: int - +maximumColor: int - +minimumAnnotation: String - +maximumAnnotation: String + + + +id: String + +name: String? + +description: String? + +icon: String + +tasks: List<InterventionTask> - - - +Map<String, dynamic> toJson() + + + +Map<String, dynamic> toJson() + +bool isBaseline() - - - - - + + + + + - - - BooleanQuestion + + + CheckmarkTask - - - <static>+questionType: String + + + <static>+taskType: String - - - +Map<String, dynamic> toJson() - +Answer<bool> constructAnswer() + + + +Map<String, dynamic> toJson() + +Map<DateTime, T> extractPropertyResults() + +Map<String, Type> getAvailableProperties() + +String? getHumanReadablePropertyName() - - - - - + + + + + - - - EligibilityCriterion + + + SupabaseObject - - - +id: String - +reason: String? - +condition: Expression + + + +primaryKeys: Map<String, dynamic> - - - +Map<String, dynamic> toJson() - +bool isSatisfied() - +bool isViolated() + + + +Map<String, dynamic> toJson() - - - - - + + + + - - - QuestionnaireTask + + + SupabaseQuery - - - <static>+taskType: String - +questions: StudyUQuestionnaire + + + <static>+dynamic getAll() + <static>+dynamic getById() + <static>+dynamic batchUpsert() + <static>+List<T> extractSupabaseList() + <static>+T extractSupabaseSingleRow() + <static>+void catchSupabaseException() - - - +Map<String, dynamic> toJson() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() + + + + + + + + + + Analytics - - - - - - - - - Observation + + + <static>+logger: Logger + <static>+onLog: StreamSubscription<LogRecord> - - - <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> + + + <static>+void init() + <static>+void dispose() + <static>+dynamic captureEvent() + <static>+dynamic captureException() + <static>+dynamic captureMessage() + <static>+void addBreadcrumb() - - - - + + + - - - PhaseSequence + + + Logger - - - +index: int - <static>+values: List<PhaseSequence> - <static>+alternating: PhaseSequence - <static>+counterBalanced: PhaseSequence - <static>+randomized: PhaseSequence - <static>+customized: PhaseSequence + + + + + + + + StreamSubscription diff --git a/docs/uml/designer_v2/lib/common_views/uml.svg b/docs/uml/designer_v2/lib/common_views/uml.svg index 5692bcf89..edb4e81fa 100644 --- a/docs/uml/designer_v2/lib/common_views/uml.svg +++ b/docs/uml/designer_v2/lib/common_views/uml.svg @@ -1,8 +1,38 @@ - - [NullHelperDecoration + + [FormSideSheetTab + | + +formViewBuilder: Widget Function(T) ] - [InputDecoration]<:-[NullHelperDecoration] + [FormSideSheetTab]o-[Widget Function(T)] + [NavbarTab]<:-[FormSideSheetTab] + + [SidesheetTab + | + +builder: Widget Function(BuildContext) + ] + + [SidesheetTab]o-[Widget Function(BuildContext)] + [NavbarTab]<:-[SidesheetTab] + + [Sidesheet + | + <static>+kDefaultWidth: double; + +titleText: String; + +body: Widget?; + +tabs: List<SidesheetTab>?; + +actionButtons: List<Widget>?; + +width: double?; + +withCloseButton: bool; + +ignoreAppBar: bool; + +collapseSingleTab: bool; + +bodyPadding: EdgeInsets?; + +wrapContent: Widget Function(Widget)? + ] + + [Sidesheet]o-[<abstract>Widget] + [Sidesheet]o-[EdgeInsets] + [Sidesheet]o-[Widget Function(Widget)?] [MouseEventsRegion | @@ -22,89 +52,76 @@ [MouseEventsRegion]o-[void Function(PointerExitEvent)?] [MouseEventsRegion]o-[SystemMouseCursor] - [ActionMenuInline - | - +actions: List<ModelAction<dynamic>>; - +iconSize: double?; - +visible: bool; - +splashRadius: double?; - +paddingVertical: double?; - +paddingHorizontal: double? + [ReactiveCustomColorPicker + ] + + [ReactiveFormField]<:-[ReactiveCustomColorPicker] + + [SplashPage | +Widget build() ] - [IconPack + [ErrorPage | - <static>+defaultPack: List<IconOption>; - <static>+material: List<IconOption> + +error: Exception? | - <static>+IconOption? resolveIconByName() + +Widget build() ] - [IconOption + [<abstract>ConsumerWidget]<:-[ErrorPage] + + [AsyncValueWidget | - +name: String; - +icon: IconData?; - +isEmpty: bool; - +props: List<Object?> + +value: AsyncValue<T>; + +data: Widget Function(T); + +error: Widget Function(Object, StackTrace?)?; + +loading: Widget Function()?; + +empty: Widget Function()? | - +String toJson(); - <static>+IconOption fromJson() + +Widget build(); + -Widget _buildDataOrEmptyWidget(); + -Widget _defaultError(); + -Widget _defaultLoad() ] - [IconOption]o-[IconData] - [<abstract>Equatable]<:-[IconOption] + [AsyncValueWidget]o-[<abstract>AsyncValue] + [AsyncValueWidget]o-[Widget Function(T)] + [AsyncValueWidget]o-[Widget Function(Object, StackTrace?)?] + [AsyncValueWidget]o-[Widget Function()?] - [ReactiveIconPicker + [Search + | + +onQueryChanged: dynamic Function(String); + +searchController: SearchController?; + +hintText: String?; + +initialText: String? ] - [ReactiveFocusableFormField]<:-[ReactiveIconPicker] + [Search]o-[dynamic Function(String)] + [Search]o-[SearchController] - [IconPicker - | - +iconOptions: List<IconOption>; - +selectedOption: IconOption?; - +onSelect: void Function(IconOption)?; - +galleryIconSize: double?; - +selectedIconSize: double?; - +focusNode: FocusNode?; - +isDisabled: bool + [SearchController | - +Widget build() + +setText: void Function(String) ] - [IconPicker]o-[IconOption] - [IconPicker]o-[void Function(IconOption)?] - [IconPicker]o-[FocusNode] + [SearchController]o-[void Function(String)] - [IconPickerField + [HtmlStylingBanner | - +iconOptions: List<IconOption>; - +selectedOption: IconOption?; - +selectedIconSize: double?; - +galleryIconSize: double?; - +onSelect: void Function(IconOption)?; - +focusNode: FocusNode?; - +isDisabled: bool + +isDismissed: bool; + +onDismissed: dynamic Function()? | +Widget build() ] - [IconPickerField]o-[IconOption] - [IconPickerField]o-[void Function(IconOption)?] - [IconPickerField]o-[FocusNode] + [HtmlStylingBanner]o-[dynamic Function()?] - [IconPickerGallery - | - +iconOptions: List<IconOption>; - +onSelect: void Function(IconOption)?; - +iconSize: double - | - +Widget build() + [NullHelperDecoration ] - [IconPickerGallery]o-[void Function(IconOption)?] + [InputDecoration]<:-[NullHelperDecoration] [<abstract>IWithBanner | @@ -141,42 +158,6 @@ [BannerStyle]o-[BannerStyle] [Enum]<:--[BannerStyle] - [Badge - | - +icon: IconData?; - +color: Color?; - +borderRadius: double; - +label: String; - +type: BadgeType; - +padding: EdgeInsets; - +iconSize: double?; - +labelStyle: TextStyle? - | - +Widget build(); - -Color? _getBackgroundColor(); - -Color _getBorderColor(); - -Color? _getLabelColor() - ] - - [Badge]o-[IconData] - [Badge]o-[Color] - [Badge]o-[BadgeType] - [Badge]o-[EdgeInsets] - [Badge]o-[TextStyle] - - [BadgeType - | - +index: int; - <static>+values: List<BadgeType>; - <static>+filled: BadgeType; - <static>+outlined: BadgeType; - <static>+outlineFill: BadgeType; - <static>+plain: BadgeType - ] - - [BadgeType]o-[BadgeType] - [Enum]<:--[BadgeType] - [ConstrainedWidthFlexible | +minWidth: double; @@ -193,62 +174,57 @@ [ConstrainedWidthFlexible]o-[<abstract>Widget] [ConstrainedWidthFlexible]o-[BoxConstraints] - [SecondaryButton + [ActionPopUpMenuButton | - +text: String; - +icon: IconData?; - +isLoading: bool; - +onPressed: void Function()? + +actions: List<ModelAction<dynamic>>; + +triggerIconColor: Color?; + +triggerIconColorHover: Color?; + +triggerIconSize: double; + +disableSplashEffect: bool; + +hideOnEmpty: bool; + +orientation: Axis; + +elevation: double?; + +splashRadius: double?; + +enabled: bool; + +position: PopupMenuPosition | - +Widget build() + +Widget build(); + -Widget _buildPopupMenu() ] - [SecondaryButton]o-[IconData] - [SecondaryButton]o-[void Function()?] + [ActionPopUpMenuButton]o-[Color] + [ActionPopUpMenuButton]o-[Axis] + [ActionPopUpMenuButton]o-[PopupMenuPosition] - [HtmlStylingBanner + [FormControlLabel | - +isDismissed: bool; - +onDismissed: dynamic Function()? + +formControl: AbstractControl<dynamic>; + +text: String; + +isClickable: bool; + +textStyle: TextStyle?; + +onClick: void Function(AbstractControl<dynamic>)? | +Widget build() ] - [HtmlStylingBanner]o-[dynamic Function()?] + [FormControlLabel]o-[<abstract>AbstractControl] + [FormControlLabel]o-[TextStyle] + [FormControlLabel]o-[void Function(AbstractControl<dynamic>)?] - [NavbarTab + [EmptyBody | - +title: String; - +intent: RoutingIntent?; - +index: int; - +enabled: bool - ] - - [NavbarTab]o-[RoutingIntent] - - [TabbedNavbar + +icon: IconData?; + +leading: Widget?; + +leadingSpacing: double?; + +title: String?; + +description: String?; + +button: Widget? | - +tabs: List<T>; - +selectedTab: T?; - +indicator: BoxDecoration?; - +height: double?; - +disabledBackgroundColor: Color?; - +disabledTooltipText: String?; - +onSelect: void Function(int, T)?; - +labelPadding: EdgeInsets?; - +labelSpacing: double?; - +indicatorSize: TabBarIndicatorSize?; - +isScrollable: bool; - +backgroundColor: Color?; - +labelColorHover: Color?; - +unselectedLabelColorHover: Color? + +Widget build() ] - [TabbedNavbar]o-[BoxDecoration] - [TabbedNavbar]o-[Color] - [TabbedNavbar]o-[void Function(int, T)?] - [TabbedNavbar]o-[EdgeInsets] - [TabbedNavbar]o-[TabBarIndicatorSize] + [EmptyBody]o-[IconData] + [EmptyBody]o-[<abstract>Widget] [ActionMenuType | @@ -261,51 +237,23 @@ [ActionMenuType]o-[ActionMenuType] [Enum]<:--[ActionMenuType] - [FormScaffold + [HelpIcon | - +formViewModel: T; - +actions: List<Widget>?; - +body: Widget; - +drawer: Widget?; - +actionsSpacing: double; - +actionsPadding: double - ] - - [FormScaffold]o-[<abstract>Widget] - - [<abstract>FormConsumerWidget + +tooltipText: String? | +Widget build() ] - [<abstract>FormConsumerRefWidget + [StudyULogo + | + +onTap: void Function()? | +Widget build() ] - [PrimaryButton - | - +text: String; - +icon: IconData?; - +isLoading: bool; - +showLoadingEarliestAfterMs: int; - +onPressed: void Function()?; - +tooltip: String; - +tooltipDisabled: String; - +enabled: bool; - +onPressedFuture: dynamic Function()?; - +innerPadding: EdgeInsets; - +minimumSize: Size?; - +isDisabled: bool - ] - - [PrimaryButton]o-[IconData] - [PrimaryButton]o-[void Function()?] - [PrimaryButton]o-[dynamic Function()?] - [PrimaryButton]o-[EdgeInsets] - [PrimaryButton]o-[Size] - - [SingleColumnLayout + [StudyULogo]o-[void Function()?] + + [SingleColumnLayout | <static>+defaultConstraints: BoxConstraints; <static>+defaultConstraintsNarrow: BoxConstraints; @@ -336,292 +284,306 @@ [SingleColumnLayoutType]o-[SingleColumnLayoutType] [Enum]<:--[SingleColumnLayoutType] - [FormTableRow + [<abstract>ISyncIndicatorViewModel | - +label: String?; - +labelBuilder: Widget Function(BuildContext)?; - +labelStyle: TextStyle?; - +labelHelpText: String?; - +input: Widget; - +control: AbstractControl<dynamic>?; - +layout: FormTableRowLayout? + +isDirty: bool; + +lastSynced: DateTime? ] - [FormTableRow]o-[Widget Function(BuildContext)?] - [FormTableRow]o-[TextStyle] - [FormTableRow]o-[<abstract>Widget] - [FormTableRow]o-[<abstract>AbstractControl] - [FormTableRow]o-[FormTableRowLayout] + [SyncIndicator + | + +state: AsyncValue<T>; + +lastSynced: DateTime?; + +isDirty: bool; + +animationDuration: int; + +iconSize: double + ] - [FormTableLayout + [SyncIndicator]o-[<abstract>AsyncValue] + + [TextParagraph | - +rows: List<FormTableRow>; - +columnWidths: Map<int, TableColumnWidth>; - +rowDivider: Widget?; - +rowLayout: FormTableRowLayout?; - +rowLabelStyle: TextStyle? + +text: String?; + +style: TextStyle?; + +selectable: bool; + +span: List<TextSpan>? | +Widget build() ] - [FormTableLayout]o-[<abstract>Widget] - [FormTableLayout]o-[FormTableRowLayout] - [FormTableLayout]o-[TextStyle] + [TextParagraph]o-[TextStyle] - [FormSectionHeader + [DismissButton | - +title: String; - +titleTextStyle: TextStyle?; - +helpText: String?; - +divider: bool; - +helpTextDisabled: bool + +onPressed: void Function()?; + +text: String? | +Widget build() ] - [FormSectionHeader]o-[TextStyle] + [DismissButton]o-[void Function()?] - [FormLabel + [Badge | - +labelText: String?; - +helpText: String?; - +labelTextStyle: TextStyle?; - +layout: FormTableRowLayout? + +icon: IconData?; + +color: Color?; + +borderRadius: double; + +label: String; + +type: BadgeType; + +padding: EdgeInsets; + +iconSize: double?; + +labelStyle: TextStyle? | - +Widget build() + +Widget build(); + -Color? _getBackgroundColor(); + -Color _getBorderColor(); + -Color? _getLabelColor() ] - [FormLabel]o-[TextStyle] - [FormLabel]o-[FormTableRowLayout] + [Badge]o-[IconData] + [Badge]o-[Color] + [Badge]o-[BadgeType] + [Badge]o-[EdgeInsets] + [Badge]o-[TextStyle] - [FormTableRowLayout + [BadgeType | +index: int; - <static>+values: List<FormTableRowLayout>; - <static>+vertical: FormTableRowLayout; - <static>+horizontal: FormTableRowLayout + <static>+values: List<BadgeType>; + <static>+filled: BadgeType; + <static>+outlined: BadgeType; + <static>+outlineFill: BadgeType; + <static>+plain: BadgeType ] - [FormTableRowLayout]o-[FormTableRowLayout] - [Enum]<:--[FormTableRowLayout] + [BadgeType]o-[BadgeType] + [Enum]<:--[BadgeType] - [FormSideSheetTab + [Hyperlink | - +formViewBuilder: Widget Function(T) + +text: String; + +url: String?; + +onClick: void Function()?; + +linkColor: Color; + +hoverColor: Color?; + +visitedColor: Color?; + +style: TextStyle?; + +hoverStyle: TextStyle?; + +visitedStyle: TextStyle?; + +icon: IconData?; + +iconSize: double? ] - [FormSideSheetTab]o-[Widget Function(T)] - [NavbarTab]<:-[FormSideSheetTab] + [Hyperlink]o-[void Function()?] + [Hyperlink]o-[Color] + [Hyperlink]o-[TextStyle] + [Hyperlink]o-[IconData] - [SidesheetTab + [FormScaffold | - +builder: Widget Function(BuildContext) + +formViewModel: T; + +actions: List<Widget>?; + +body: Widget; + +drawer: Widget?; + +actionsSpacing: double; + +actionsPadding: double ] - [SidesheetTab]o-[Widget Function(BuildContext)] - [NavbarTab]<:-[SidesheetTab] + [FormScaffold]o-[<abstract>Widget] - [Sidesheet + [PrimaryButton | - <static>+kDefaultWidth: double; - +titleText: String; - +body: Widget?; - +tabs: List<SidesheetTab>?; - +actionButtons: List<Widget>?; - +width: double?; - +withCloseButton: bool; - +ignoreAppBar: bool; - +collapseSingleTab: bool; - +bodyPadding: EdgeInsets?; - +wrapContent: Widget Function(Widget)? + +text: String; + +icon: IconData?; + +isLoading: bool; + +showLoadingEarliestAfterMs: int; + +onPressed: void Function()?; + +tooltip: String; + +tooltipDisabled: String; + +enabled: bool; + +onPressedFuture: dynamic Function()?; + +innerPadding: EdgeInsets; + +minimumSize: Size?; + +isDisabled: bool ] - [Sidesheet]o-[<abstract>Widget] - [Sidesheet]o-[EdgeInsets] - [Sidesheet]o-[Widget Function(Widget)?] + [PrimaryButton]o-[IconData] + [PrimaryButton]o-[void Function()?] + [PrimaryButton]o-[dynamic Function()?] + [PrimaryButton]o-[EdgeInsets] + [PrimaryButton]o-[Size] [UnderConstruction | +Widget build() ] - [DismissButton + [ActionMenuInline | - +onPressed: void Function()?; - +text: String? + +actions: List<ModelAction<dynamic>>; + +iconSize: double?; + +visible: bool; + +splashRadius: double?; + +paddingVertical: double?; + +paddingHorizontal: double? | +Widget build() ] - [DismissButton]o-[void Function()?] - - [TwoColumnLayout + [IconPack | - <static>+defaultDivider: VerticalDivider; - <static>+defaultContentPadding: EdgeInsets; - <static>+slimContentPadding: EdgeInsets; - +leftWidget: Widget; - +rightWidget: Widget; - +dividerWidget: Widget?; - +headerWidget: Widget?; - +flexLeft: int?; - +flexRight: int?; - +constraintsLeft: BoxConstraints?; - +constraintsRight: BoxConstraints?; - +scrollLeft: bool; - +scrollRight: bool; - +paddingLeft: EdgeInsets?; - +paddingRight: EdgeInsets?; - +backgroundColorLeft: Color?; - +backgroundColorRight: Color?; - +stretchHeight: bool + <static>+defaultPack: List<IconOption>; + <static>+material: List<IconOption> + | + <static>+IconOption? resolveIconByName() ] - [TwoColumnLayout]o-[VerticalDivider] - [TwoColumnLayout]o-[EdgeInsets] - [TwoColumnLayout]o-[<abstract>Widget] - [TwoColumnLayout]o-[BoxConstraints] - [TwoColumnLayout]o-[Color] - - [ErrorPage + [IconOption | - +error: Exception? + +name: String; + +icon: IconData?; + +isEmpty: bool; + +props: List<Object?> | - +Widget build() + +String toJson(); + <static>+IconOption fromJson() ] - [<abstract>ConsumerWidget]<:-[ErrorPage] + [IconOption]o-[IconData] + [<abstract>Equatable]<:-[IconOption] - [SplashPage - | - +Widget build() + [ReactiveIconPicker ] - [Hyperlink + [ReactiveFocusableFormField]<:-[ReactiveIconPicker] + + [IconPicker | - +text: String; - +url: String?; - +onClick: void Function()?; - +linkColor: Color; - +hoverColor: Color?; - +visitedColor: Color?; - +style: TextStyle?; - +hoverStyle: TextStyle?; - +visitedStyle: TextStyle?; - +icon: IconData?; - +iconSize: double? + +iconOptions: List<IconOption>; + +selectedOption: IconOption?; + +onSelect: void Function(IconOption)?; + +galleryIconSize: double?; + +selectedIconSize: double?; + +focusNode: FocusNode?; + +isDisabled: bool + | + +Widget build() ] - [Hyperlink]o-[void Function()?] - [Hyperlink]o-[Color] - [Hyperlink]o-[TextStyle] - [Hyperlink]o-[IconData] + [IconPicker]o-[IconOption] + [IconPicker]o-[void Function(IconOption)?] + [IconPicker]o-[FocusNode] - [StandardDialog + [IconPickerField | - +title: Widget?; - +titleText: String?; - +body: Widget; - +actionButtons: List<Widget>; - +backgroundColor: Color?; - +borderRadius: double?; - +width: double?; - +height: double?; - +minWidth: double; - +minHeight: double; - +maxWidth: double?; - +maxHeight: double?; - +padding: EdgeInsets + +iconOptions: List<IconOption>; + +selectedOption: IconOption?; + +selectedIconSize: double?; + +galleryIconSize: double?; + +onSelect: void Function(IconOption)?; + +focusNode: FocusNode?; + +isDisabled: bool | +Widget build() ] - [StandardDialog]o-[<abstract>Widget] - [StandardDialog]o-[Color] - [StandardDialog]o-[EdgeInsets] + [IconPickerField]o-[IconOption] + [IconPickerField]o-[void Function(IconOption)?] + [IconPickerField]o-[FocusNode] - [StudyULogo + [IconPickerGallery | - +onTap: void Function()? + +iconOptions: List<IconOption>; + +onSelect: void Function(IconOption)?; + +iconSize: double | +Widget build() ] - [StudyULogo]o-[void Function()?] + [IconPickerGallery]o-[void Function(IconOption)?] - [HelpIcon - | - +tooltipText: String? + [<abstract>FormConsumerWidget | +Widget build() ] - [EmptyBody - | - +icon: IconData?; - +leading: Widget?; - +leadingSpacing: double?; - +title: String?; - +description: String?; - +button: Widget? + [<abstract>FormConsumerRefWidget | +Widget build() ] - [EmptyBody]o-[IconData] - [EmptyBody]o-[<abstract>Widget] - - [ReactiveCustomColorPicker + [Collapsible + | + +contentBuilder: Widget Function(BuildContext, bool); + +headerBuilder: Widget Function(BuildContext, bool)?; + +title: String?; + +isCollapsed: bool ] - [ReactiveFormField]<:-[ReactiveCustomColorPicker] + [Collapsible]o-[Widget Function(BuildContext, bool)] + [Collapsible]o-[Widget Function(BuildContext, bool)?] - [TextParagraph + [StandardDialog | - +text: String?; - +style: TextStyle?; - +selectable: bool; - +span: List<TextSpan>? + +title: Widget?; + +titleText: String?; + +body: Widget; + +actionButtons: List<Widget>; + +backgroundColor: Color?; + +borderRadius: double?; + +width: double?; + +height: double?; + +minWidth: double; + +minHeight: double; + +maxWidth: double?; + +maxHeight: double?; + +padding: EdgeInsets | +Widget build() ] - [TextParagraph]o-[TextStyle] + [StandardDialog]o-[<abstract>Widget] + [StandardDialog]o-[Color] + [StandardDialog]o-[EdgeInsets] - [FormControlLabel + [SecondaryButton | - +formControl: AbstractControl<dynamic>; +text: String; - +isClickable: bool; - +textStyle: TextStyle?; - +onClick: void Function(AbstractControl<dynamic>)? + +icon: IconData?; + +isLoading: bool; + +onPressed: void Function()? | +Widget build() ] - [FormControlLabel]o-[<abstract>AbstractControl] - [FormControlLabel]o-[TextStyle] - [FormControlLabel]o-[void Function(AbstractControl<dynamic>)?] + [SecondaryButton]o-[IconData] + [SecondaryButton]o-[void Function()?] [StandardTableColumn | +label: String; +tooltip: String?; - +columnWidth: TableColumnWidth + +columnWidth: TableColumnWidth; + +sortable: bool; + +sortAscending: bool?; + +sortableIcon: Widget? ] [StandardTableColumn]o-[<abstract>TableColumnWidth] + [StandardTableColumn]o-[<abstract>Widget] [StandardTable | +items: List<T>; - +columns: List<StandardTableColumn>; + +inputColumns: List<StandardTableColumn>; +onSelectItem: void Function(T); +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)?; +trailingActionsMenuType: ActionMenuType?; + +sortColumnPredicates: List<int Function(T, T)?>?; + +pinnedPredicates: int Function(T, T)?; +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; - +trailingActionsColumn: StandardTableColumn; + +inputTrailingActionsColumn: StandardTableColumn; +tableWrapper: Widget Function(Widget)?; +cellSpacing: double; +rowSpacing: double; @@ -640,6 +602,7 @@ [StandardTable]o-[void Function(T)] [StandardTable]o-[List<ModelAction<dynamic>> Function(T, int)?] [StandardTable]o-[ActionMenuType] + [StandardTable]o-[int Function(T, T)?] [StandardTable]o-[TableRow Function(BuildContext, List<StandardTableColumn>)?] [StandardTable]o-[StandardTableColumn] [StandardTable]o-[Widget Function(Widget)?] @@ -654,570 +617,770 @@ <static>+material: StandardTableStyle ] - [StandardTableStyle]o-[StandardTableStyle] - [Enum]<:--[StandardTableStyle] + [StandardTableStyle]o-[StandardTableStyle] + [Enum]<:--[StandardTableStyle] + + [TwoColumnLayout + | + <static>+defaultDivider: VerticalDivider; + <static>+defaultContentPadding: EdgeInsets; + <static>+slimContentPadding: EdgeInsets; + +leftWidget: Widget; + +rightWidget: Widget; + +dividerWidget: Widget?; + +headerWidget: Widget?; + +flexLeft: int?; + +flexRight: int?; + +constraintsLeft: BoxConstraints?; + +constraintsRight: BoxConstraints?; + +scrollLeft: bool; + +scrollRight: bool; + +paddingLeft: EdgeInsets?; + +paddingRight: EdgeInsets?; + +backgroundColorLeft: Color?; + +backgroundColorRight: Color?; + +stretchHeight: bool + ] + + [TwoColumnLayout]o-[VerticalDivider] + [TwoColumnLayout]o-[EdgeInsets] + [TwoColumnLayout]o-[<abstract>Widget] + [TwoColumnLayout]o-[BoxConstraints] + [TwoColumnLayout]o-[Color] + + [NavbarTab + | + +title: String; + +intent: RoutingIntent?; + +index: int; + +enabled: bool + ] + + [NavbarTab]o-[RoutingIntent] + + [TabbedNavbar + | + +tabs: List<T>; + +selectedTab: T?; + +indicator: BoxDecoration?; + +height: double?; + +disabledBackgroundColor: Color?; + +disabledTooltipText: String?; + +onSelect: void Function(int, T)?; + +labelPadding: EdgeInsets?; + +labelSpacing: double?; + +indicatorSize: TabBarIndicatorSize?; + +isScrollable: bool; + +backgroundColor: Color?; + +labelColorHover: Color?; + +unselectedLabelColorHover: Color? + ] + + [TabbedNavbar]o-[BoxDecoration] + [TabbedNavbar]o-[Color] + [TabbedNavbar]o-[void Function(int, T)?] + [TabbedNavbar]o-[EdgeInsets] + [TabbedNavbar]o-[TabBarIndicatorSize] + + [FormTableRow + | + +label: String?; + +labelBuilder: Widget Function(BuildContext)?; + +labelStyle: TextStyle?; + +labelHelpText: String?; + +input: Widget; + +control: AbstractControl<dynamic>?; + +layout: FormTableRowLayout? + ] + + [FormTableRow]o-[Widget Function(BuildContext)?] + [FormTableRow]o-[TextStyle] + [FormTableRow]o-[<abstract>Widget] + [FormTableRow]o-[<abstract>AbstractControl] + [FormTableRow]o-[FormTableRowLayout] - [Collapsible + [FormTableLayout | - +contentBuilder: Widget Function(BuildContext, bool); - +headerBuilder: Widget Function(BuildContext, bool)?; - +title: String?; - +isCollapsed: bool + +rows: List<FormTableRow>; + +columnWidths: Map<int, TableColumnWidth>; + +rowDivider: Widget?; + +rowLayout: FormTableRowLayout?; + +rowLabelStyle: TextStyle? + | + +Widget build() ] - [Collapsible]o-[Widget Function(BuildContext, bool)] - [Collapsible]o-[Widget Function(BuildContext, bool)?] + [FormTableLayout]o-[<abstract>Widget] + [FormTableLayout]o-[FormTableRowLayout] + [FormTableLayout]o-[TextStyle] - [<abstract>ISyncIndicatorViewModel + [FormSectionHeader | - +isDirty: bool; - +lastSynced: DateTime? - ] - - [SyncIndicator + +title: String; + +titleTextStyle: TextStyle?; + +helpText: String?; + +divider: bool; + +helpTextDisabled: bool | - +state: AsyncValue<T>; - +lastSynced: DateTime?; - +isDirty: bool; - +animationDuration: int; - +iconSize: double + +Widget build() ] - [SyncIndicator]o-[<abstract>AsyncValue] + [FormSectionHeader]o-[TextStyle] - [ActionPopUpMenuButton + [FormLabel | - +actions: List<ModelAction<dynamic>>; - +triggerIconColor: Color?; - +triggerIconColorHover: Color?; - +triggerIconSize: double; - +disableSplashEffect: bool; - +hideOnEmpty: bool; - +orientation: Axis; - +elevation: double?; - +splashRadius: double?; - +enabled: bool; - +position: PopupMenuPosition + +labelText: String?; + +helpText: String?; + +labelTextStyle: TextStyle?; + +layout: FormTableRowLayout? | - +Widget build(); - -Widget _buildPopupMenu() + +Widget build() ] - [ActionPopUpMenuButton]o-[Color] - [ActionPopUpMenuButton]o-[Axis] - [ActionPopUpMenuButton]o-[PopupMenuPosition] + [FormLabel]o-[TextStyle] + [FormLabel]o-[FormTableRowLayout] - [AsyncValueWidget - | - +value: AsyncValue<T>; - +data: Widget Function(T); - +error: Widget Function(Object, StackTrace?)?; - +loading: Widget Function()?; - +empty: Widget Function()? + [FormTableRowLayout | - +Widget build(); - -Widget _buildDataOrEmptyWidget(); - -Widget _defaultError(); - -Widget _defaultLoad() + +index: int; + <static>+values: List<FormTableRowLayout>; + <static>+vertical: FormTableRowLayout; + <static>+horizontal: FormTableRowLayout ] - [AsyncValueWidget]o-[<abstract>AsyncValue] - [AsyncValueWidget]o-[Widget Function(T)] - [AsyncValueWidget]o-[Widget Function(Object, StackTrace?)?] - [AsyncValueWidget]o-[Widget Function()?] + [FormTableRowLayout]o-[FormTableRowLayout] + [Enum]<:--[FormTableRowLayout] - + - + - - - - + + - + - + + + - + - + + + - + - + - + - + - + - + - + - - - - - + - + - + - + - + - + - + - + - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - - + + + - + - + - + - + - + - + - + - + - + + + + - + + - + - - + + + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + + - + - + - + - + - + - - + + + - - + - + + + + - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + - + - - + + + - - + - + - - - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - + - + + + + - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + + + + + + + + + + - - - NullHelperDecoration + + + FormSideSheetTab + + + + + + +formViewBuilder: Widget Function(T) - - - + + + - - - InputDecoration + + + Widget Function(T) + + + + + + + + + + + + NavbarTab + + + + + + +title: String + +intent: RoutingIntent? + +index: int + +enabled: bool + + + + + + + + + + + + SidesheetTab + + + + + + +builder: Widget Function(BuildContext) + + + + + + + + + + + Widget Function(BuildContext) + + + + + + + + + + + + Sidesheet + + + + + + <static>+kDefaultWidth: double + +titleText: String + +body: Widget? + +tabs: List<SidesheetTab>? + +actionButtons: List<Widget>? + +width: double? + +withCloseButton: bool + +ignoreAppBar: bool + +collapseSingleTab: bool + +bodyPadding: EdgeInsets? + +wrapContent: Widget Function(Widget)? + + + + + + + + + + + Widget + + + + + + + + + + + EdgeInsets + + + + + + + + + + + Widget Function(Widget)? - - + + - + MouseEventsRegion - + +onTap: void Function()? +onHover: void Function(PointerHoverEvent)? @@ -1233,9 +1396,9 @@ - + - + void Function()? @@ -1244,9 +1407,9 @@ - + - + void Function(PointerHoverEvent)? @@ -1255,9 +1418,9 @@ - + - + void Function(PointerEnterEvent)? @@ -1266,9 +1429,9 @@ - + - + void Function(PointerExitEvent)? @@ -1277,267 +1440,288 @@ - + - + SystemMouseCursor - - - - - + + + - - - ActionMenuInline + + + ReactiveCustomColorPicker - - - +actions: List<ModelAction<dynamic>> - +iconSize: double? - +visible: bool - +splashRadius: double? - +paddingVertical: double? - +paddingHorizontal: double? + + + + + + + + ReactiveFormField + + + + + + + + + + + + SplashPage - - - +Widget build() + + + +Widget build() - - - - - + + + + + - - - IconPack + + + ErrorPage - - - <static>+defaultPack: List<IconOption> - <static>+material: List<IconOption> + + + +error: Exception? - - - <static>+IconOption? resolveIconByName() + + + +Widget build() - - - - - + + + - - - IconOption + + + ConsumerWidget - - - +name: String - +icon: IconData? - +isEmpty: bool - +props: List<Object?> + + + + + + + + + + AsyncValueWidget - - - +String toJson() - <static>+IconOption fromJson() + + + +value: AsyncValue<T> + +data: Widget Function(T) + +error: Widget Function(Object, StackTrace?)? + +loading: Widget Function()? + +empty: Widget Function()? - - - - - - - - IconData + + + +Widget build() + -Widget _buildDataOrEmptyWidget() + -Widget _defaultError() + -Widget _defaultLoad() - - - + + + - - - Equatable + + + AsyncValue - - - + + + - - - ReactiveIconPicker + + + Widget Function(Object, StackTrace?)? - - - + + + - - - ReactiveFocusableFormField + + + Widget Function()? - - - - - + + + + - - - IconPicker + + + Search - - - +iconOptions: List<IconOption> - +selectedOption: IconOption? - +onSelect: void Function(IconOption)? - +galleryIconSize: double? - +selectedIconSize: double? - +focusNode: FocusNode? - +isDisabled: bool + + + +onQueryChanged: dynamic Function(String) + +searchController: SearchController? + +hintText: String? + +initialText: String? - - - +Widget build() + + + + + + + + dynamic Function(String) - - - + + + + - - - void Function(IconOption)? + + + SearchController + + + + + + +setText: void Function(String) - - - + + + - - - FocusNode + + + void Function(String) - - - - - + + + + + - - - IconPickerField + + + HtmlStylingBanner - - - +iconOptions: List<IconOption> - +selectedOption: IconOption? - +selectedIconSize: double? - +galleryIconSize: double? - +onSelect: void Function(IconOption)? - +focusNode: FocusNode? - +isDisabled: bool + + + +isDismissed: bool + +onDismissed: dynamic Function()? - - - +Widget build() + + + +Widget build() - - - - - + + + - - - IconPickerGallery + + + dynamic Function()? - - - +iconOptions: List<IconOption> - +onSelect: void Function(IconOption)? - +iconSize: double + + + + + + + + NullHelperDecoration - - - +Widget build() + + + + + + + + InputDecoration - - + + - + IWithBanner - + +Widget? banner() @@ -1546,16 +1730,16 @@ - - + + - + BannerBox - + +prefixIcon: Widget? +body: Widget @@ -1570,29 +1754,18 @@ - - - - - - - Widget - - - - - - + + - + BannerStyle - + +index: int <static>+values: List<BannerStyle> @@ -1603,132 +1776,30 @@ - - - - - - - EdgeInsets - - - - - - - - - - - dynamic Function()? - - - - - + - + Enum - - - - - - - - - Badge - - - - - - +icon: IconData? - +color: Color? - +borderRadius: double - +label: String - +type: BadgeType - +padding: EdgeInsets - +iconSize: double? - +labelStyle: TextStyle? - - - - - - +Widget build() - -Color? _getBackgroundColor() - -Color _getBorderColor() - -Color? _getLabelColor() - - - - - - - - - - - Color - - - - - - - - - - - - BadgeType - - - - - - +index: int - <static>+values: List<BadgeType> - <static>+filled: BadgeType - <static>+outlined: BadgeType - <static>+outlineFill: BadgeType - <static>+plain: BadgeType - - - - - - - - - - - TextStyle - - - - - - - + + + - + ConstrainedWidthFlexible - + +minWidth: double +maxWidth: double @@ -1739,7 +1810,7 @@ - + +Widget build() -double _getWidth() @@ -1749,177 +1820,199 @@ - + - + BoxConstraints - - - - - + + + + + - - - SecondaryButton + + + ActionPopUpMenuButton - - - +text: String - +icon: IconData? - +isLoading: bool - +onPressed: void Function()? + + + +actions: List<ModelAction<dynamic>> + +triggerIconColor: Color? + +triggerIconColorHover: Color? + +triggerIconSize: double + +disableSplashEffect: bool + +hideOnEmpty: bool + +orientation: Axis + +elevation: double? + +splashRadius: double? + +enabled: bool + +position: PopupMenuPosition - - - +Widget build() + + + +Widget build() + -Widget _buildPopupMenu() - - - - - + + + - - - HtmlStylingBanner + + + Color - - - +isDismissed: bool - +onDismissed: dynamic Function()? + + + + + + + + Axis - - - +Widget build() + + + + + + + + PopupMenuPosition - - - - + + + + + - - - NavbarTab + + + FormControlLabel - - - +title: String - +intent: RoutingIntent? - +index: int - +enabled: bool + + + +formControl: AbstractControl<dynamic> + +text: String + +isClickable: bool + +textStyle: TextStyle? + +onClick: void Function(AbstractControl<dynamic>)? + + + + + + +Widget build() - - - + + + - - - RoutingIntent + + + AbstractControl - - - - + + + - - - TabbedNavbar + + + TextStyle - - - +tabs: List<T> - +selectedTab: T? - +indicator: BoxDecoration? - +height: double? - +disabledBackgroundColor: Color? - +disabledTooltipText: String? - +onSelect: void Function(int, T)? - +labelPadding: EdgeInsets? - +labelSpacing: double? - +indicatorSize: TabBarIndicatorSize? - +isScrollable: bool - +backgroundColor: Color? - +labelColorHover: Color? - +unselectedLabelColorHover: Color? + + + + + + + + void Function(AbstractControl<dynamic>)? - - - + + + + + - - - BoxDecoration + + + EmptyBody - - - - + + + +icon: IconData? + +leading: Widget? + +leadingSpacing: double? + +title: String? + +description: String? + +button: Widget? + + - - - void Function(int, T)? + + + +Widget build() - - - + + + - - - TabBarIndicatorSize + + + IconData - - + + - + ActionMenuType - + +index: int <static>+values: List<ActionMenuType> @@ -1929,118 +2022,69 @@ - - - - - - - - FormScaffold - - - - - - +formViewModel: T - +actions: List<Widget>? - +body: Widget - +drawer: Widget? - +actionsSpacing: double - +actionsPadding: double - - - - - - - - - - - - FormConsumerWidget - - + + + + + - - - +Widget build() + + + HelpIcon - - - - - - - - - FormConsumerRefWidget + + + +tooltipText: String? - - - +Widget build() + + + +Widget build() - - - - + + + + + - - - PrimaryButton + + + StudyULogo - - - +text: String - +icon: IconData? - +isLoading: bool - +showLoadingEarliestAfterMs: int - +onPressed: void Function()? - +tooltip: String - +tooltipDisabled: String - +enabled: bool - +onPressedFuture: dynamic Function()? - +innerPadding: EdgeInsets - +minimumSize: Size? - +isDisabled: bool + + + +onTap: void Function()? - - - - - - - - Size + + + +Widget build() - - - + + + - + SingleColumnLayout - + <static>+defaultConstraints: BoxConstraints <static>+defaultConstraintsNarrow: BoxConstraints @@ -2053,7 +2097,7 @@ - + <static>+dynamic fromType() @@ -2062,16 +2106,16 @@ - - + + - + SingleColumnLayoutType - + +index: int <static>+values: List<SingleColumnLayoutType> @@ -2083,660 +2127,669 @@ - - - - - - - - FormTableRow - - - - - - +label: String? - +labelBuilder: Widget Function(BuildContext)? - +labelStyle: TextStyle? - +labelHelpText: String? - +input: Widget - +control: AbstractControl<dynamic>? - +layout: FormTableRowLayout? - - - - - - - - - - - Widget Function(BuildContext)? - - + + + + - - - - + + + ISyncIndicatorViewModel + + - - - AbstractControl + + + +isDirty: bool + +lastSynced: DateTime? - - - - + + + + - - - FormTableRowLayout + + + SyncIndicator - - - +index: int - <static>+values: List<FormTableRowLayout> - <static>+vertical: FormTableRowLayout - <static>+horizontal: FormTableRowLayout + + + +state: AsyncValue<T> + +lastSynced: DateTime? + +isDirty: bool + +animationDuration: int + +iconSize: double - - - - - + + + + + - - - FormTableLayout + + + TextParagraph - - - +rows: List<FormTableRow> - +columnWidths: Map<int, TableColumnWidth> - +rowDivider: Widget? - +rowLayout: FormTableRowLayout? - +rowLabelStyle: TextStyle? + + + +text: String? + +style: TextStyle? + +selectable: bool + +span: List<TextSpan>? - - - +Widget build() + + + +Widget build() - - - - - + + + + + - - - FormSectionHeader + + + DismissButton - - - +title: String - +titleTextStyle: TextStyle? - +helpText: String? - +divider: bool - +helpTextDisabled: bool + + + +onPressed: void Function()? + +text: String? - - - +Widget build() + + + +Widget build() - - - - - + + + + + - - - FormLabel + + + Badge - - - +labelText: String? - +helpText: String? - +labelTextStyle: TextStyle? - +layout: FormTableRowLayout? + + + +icon: IconData? + +color: Color? + +borderRadius: double + +label: String + +type: BadgeType + +padding: EdgeInsets + +iconSize: double? + +labelStyle: TextStyle? - - - +Widget build() + + + +Widget build() + -Color? _getBackgroundColor() + -Color _getBorderColor() + -Color? _getLabelColor() - - - - + + + + - - - FormSideSheetTab + + + BadgeType - - - +formViewBuilder: Widget Function(T) + + + +index: int + <static>+values: List<BadgeType> + <static>+filled: BadgeType + <static>+outlined: BadgeType + <static>+outlineFill: BadgeType + <static>+plain: BadgeType - - - + + + + - - - Widget Function(T) + + + Hyperlink - - - - - - - - - SidesheetTab + + + +text: String + +url: String? + +onClick: void Function()? + +linkColor: Color + +hoverColor: Color? + +visitedColor: Color? + +style: TextStyle? + +hoverStyle: TextStyle? + +visitedStyle: TextStyle? + +icon: IconData? + +iconSize: double? - - - +builder: Widget Function(BuildContext) + + + + + + + + + FormScaffold - - - - - - - - Widget Function(BuildContext) + + + +formViewModel: T + +actions: List<Widget>? + +body: Widget + +drawer: Widget? + +actionsSpacing: double + +actionsPadding: double - - - - + + + + - - - Sidesheet + + + PrimaryButton - - - <static>+kDefaultWidth: double - +titleText: String - +body: Widget? - +tabs: List<SidesheetTab>? - +actionButtons: List<Widget>? - +width: double? - +withCloseButton: bool - +ignoreAppBar: bool - +collapseSingleTab: bool - +bodyPadding: EdgeInsets? - +wrapContent: Widget Function(Widget)? + + + +text: String + +icon: IconData? + +isLoading: bool + +showLoadingEarliestAfterMs: int + +onPressed: void Function()? + +tooltip: String + +tooltipDisabled: String + +enabled: bool + +onPressedFuture: dynamic Function()? + +innerPadding: EdgeInsets + +minimumSize: Size? + +isDisabled: bool - - - + + + - - - Widget Function(Widget)? + + + Size - - + + - + UnderConstruction - + +Widget build() - - - - - + + + + + - - - DismissButton + + + ActionMenuInline - - - +onPressed: void Function()? - +text: String? + + + +actions: List<ModelAction<dynamic>> + +iconSize: double? + +visible: bool + +splashRadius: double? + +paddingVertical: double? + +paddingHorizontal: double? - - - +Widget build() + + + +Widget build() - - - - + + + + + - - - TwoColumnLayout + + + IconPack - - - <static>+defaultDivider: VerticalDivider - <static>+defaultContentPadding: EdgeInsets - <static>+slimContentPadding: EdgeInsets - +leftWidget: Widget - +rightWidget: Widget - +dividerWidget: Widget? - +headerWidget: Widget? - +flexLeft: int? - +flexRight: int? - +constraintsLeft: BoxConstraints? - +constraintsRight: BoxConstraints? - +scrollLeft: bool - +scrollRight: bool - +paddingLeft: EdgeInsets? - +paddingRight: EdgeInsets? - +backgroundColorLeft: Color? - +backgroundColorRight: Color? - +stretchHeight: bool + + + <static>+defaultPack: List<IconOption> + <static>+material: List<IconOption> - - - - - - - - VerticalDivider + + + <static>+IconOption? resolveIconByName() - - - - - + + + + + - - - ErrorPage + + + IconOption - - - +error: Exception? + + + +name: String + +icon: IconData? + +isEmpty: bool + +props: List<Object?> - - - +Widget build() + + + +String toJson() + <static>+IconOption fromJson() - - - + + + - - - ConsumerWidget + + + Equatable - - - - + + + - - - SplashPage + + + ReactiveIconPicker - - - +Widget build() + + + + + + + + ReactiveFocusableFormField - - - - + + + + + - - - Hyperlink + + + IconPicker - - - +text: String - +url: String? - +onClick: void Function()? - +linkColor: Color - +hoverColor: Color? - +visitedColor: Color? - +style: TextStyle? - +hoverStyle: TextStyle? - +visitedStyle: TextStyle? - +icon: IconData? - +iconSize: double? + + + +iconOptions: List<IconOption> + +selectedOption: IconOption? + +onSelect: void Function(IconOption)? + +galleryIconSize: double? + +selectedIconSize: double? + +focusNode: FocusNode? + +isDisabled: bool - - - - - - - - - - StandardDialog + + + +Widget build() - - - +title: Widget? - +titleText: String? - +body: Widget - +actionButtons: List<Widget> - +backgroundColor: Color? - +borderRadius: double? - +width: double? - +height: double? - +minWidth: double - +minHeight: double - +maxWidth: double? - +maxHeight: double? - +padding: EdgeInsets + + + + + + + + void Function(IconOption)? - - - +Widget build() + + + + + + + + FocusNode - - - - - + + + + + - - - StudyULogo + + + IconPickerField - - - +onTap: void Function()? + + + +iconOptions: List<IconOption> + +selectedOption: IconOption? + +selectedIconSize: double? + +galleryIconSize: double? + +onSelect: void Function(IconOption)? + +focusNode: FocusNode? + +isDisabled: bool - - - +Widget build() + + + +Widget build() - - - - - + + + + + - - - HelpIcon + + + IconPickerGallery - - - +tooltipText: String? + + + +iconOptions: List<IconOption> + +onSelect: void Function(IconOption)? + +iconSize: double - - - +Widget build() + + + +Widget build() - - - - - + + + + - - - EmptyBody + + + FormConsumerWidget - - - +icon: IconData? - +leading: Widget? - +leadingSpacing: double? - +title: String? - +description: String? - +button: Widget? + + + +Widget build() - - - +Widget build() + + + + + + + + + FormConsumerRefWidget - - - - - - - - ReactiveCustomColorPicker + + + +Widget build() - - - + + + + - - - ReactiveFormField + + + Collapsible - - - - - - - - - - TextParagraph + + + +contentBuilder: Widget Function(BuildContext, bool) + +headerBuilder: Widget Function(BuildContext, bool)? + +title: String? + +isCollapsed: bool - - - +text: String? - +style: TextStyle? - +selectable: bool - +span: List<TextSpan>? + + + + + + + + Widget Function(BuildContext, bool) - - - +Widget build() + + + + + + + + Widget Function(BuildContext, bool)? - - - - - + + + + + - - - FormControlLabel + + + StandardDialog - - - +formControl: AbstractControl<dynamic> - +text: String - +isClickable: bool - +textStyle: TextStyle? - +onClick: void Function(AbstractControl<dynamic>)? + + + +title: Widget? + +titleText: String? + +body: Widget + +actionButtons: List<Widget> + +backgroundColor: Color? + +borderRadius: double? + +width: double? + +height: double? + +minWidth: double + +minHeight: double + +maxWidth: double? + +maxHeight: double? + +padding: EdgeInsets - - - +Widget build() + + + +Widget build() - - - + + + + + - - - void Function(AbstractControl<dynamic>)? + + + SecondaryButton + + + + + + +text: String + +icon: IconData? + +isLoading: bool + +onPressed: void Function()? + + + + + + +Widget build() - - + + - + StandardTableColumn - + +label: String +tooltip: String? +columnWidth: TableColumnWidth + +sortable: bool + +sortAscending: bool? + +sortableIcon: Widget? - + - + TableColumnWidth @@ -2745,47 +2798,49 @@ - - + + - + StandardTable - + +items: List<T> - +columns: List<StandardTableColumn> + +inputColumns: List<StandardTableColumn> +onSelectItem: void Function(T) +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)? +trailingActionsMenuType: ActionMenuType? - +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? - +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? - +trailingActionsColumn: StandardTableColumn - +tableWrapper: Widget Function(Widget)? - +cellSpacing: double - +rowSpacing: double - +minRowHeight: double? - +showTableHeader: bool - +hideLeadingTrailingWhenEmpty: bool - +leadingWidget: Widget? - +trailingWidget: Widget? - +leadingWidgetSpacing: double? - +trailingWidgetSpacing: double? - +emptyWidget: Widget? - +rowStyle: StandardTableStyle - +disableRowInteractions: bool + +sortColumnPredicates: List<int Function(T, T)?>? + +pinnedPredicates: int Function(T, T)? + +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? + +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? + +inputTrailingActionsColumn: StandardTableColumn + +tableWrapper: Widget Function(Widget)? + +cellSpacing: double + +rowSpacing: double + +minRowHeight: double? + +showTableHeader: bool + +hideLeadingTrailingWhenEmpty: bool + +leadingWidget: Widget? + +trailingWidget: Widget? + +leadingWidgetSpacing: double? + +trailingWidgetSpacing: double? + +emptyWidget: Widget? + +rowStyle: StandardTableStyle + +disableRowInteractions: bool - + - + void Function(T) @@ -2794,20 +2849,31 @@ - + - + List<ModelAction<dynamic>> Function(T, int)? + + + + + + + int Function(T, T)? + + + + - + - + TableRow Function(BuildContext, List<StandardTableColumn>)? @@ -2816,16 +2882,16 @@ - - + + - + StandardTableStyle - + +index: int <static>+values: List<StandardTableStyle> @@ -2835,209 +2901,265 @@ - - - - + + + + - - - Collapsible + + + TwoColumnLayout - - - +contentBuilder: Widget Function(BuildContext, bool) - +headerBuilder: Widget Function(BuildContext, bool)? - +title: String? - +isCollapsed: bool + + + <static>+defaultDivider: VerticalDivider + <static>+defaultContentPadding: EdgeInsets + <static>+slimContentPadding: EdgeInsets + +leftWidget: Widget + +rightWidget: Widget + +dividerWidget: Widget? + +headerWidget: Widget? + +flexLeft: int? + +flexRight: int? + +constraintsLeft: BoxConstraints? + +constraintsRight: BoxConstraints? + +scrollLeft: bool + +scrollRight: bool + +paddingLeft: EdgeInsets? + +paddingRight: EdgeInsets? + +backgroundColorLeft: Color? + +backgroundColorRight: Color? + +stretchHeight: bool - - - + + + - - - Widget Function(BuildContext, bool) + + + VerticalDivider - - - + + + - - - Widget Function(BuildContext, bool)? + + + RoutingIntent - - - - + + + + - - - ISyncIndicatorViewModel + + + TabbedNavbar - - - +isDirty: bool - +lastSynced: DateTime? + + + +tabs: List<T> + +selectedTab: T? + +indicator: BoxDecoration? + +height: double? + +disabledBackgroundColor: Color? + +disabledTooltipText: String? + +onSelect: void Function(int, T)? + +labelPadding: EdgeInsets? + +labelSpacing: double? + +indicatorSize: TabBarIndicatorSize? + +isScrollable: bool + +backgroundColor: Color? + +labelColorHover: Color? + +unselectedLabelColorHover: Color? - - - - + + + - - - SyncIndicator + + + BoxDecoration - - - +state: AsyncValue<T> - +lastSynced: DateTime? - +isDirty: bool - +animationDuration: int - +iconSize: double + + + + + + + + void Function(int, T)? - - - + + + - - - AsyncValue + + + TabBarIndicatorSize - - - - - + + + + - - - ActionPopUpMenuButton + + + FormTableRow - - - +actions: List<ModelAction<dynamic>> - +triggerIconColor: Color? - +triggerIconColorHover: Color? - +triggerIconSize: double - +disableSplashEffect: bool - +hideOnEmpty: bool - +orientation: Axis - +elevation: double? - +splashRadius: double? - +enabled: bool - +position: PopupMenuPosition + + + +label: String? + +labelBuilder: Widget Function(BuildContext)? + +labelStyle: TextStyle? + +labelHelpText: String? + +input: Widget + +control: AbstractControl<dynamic>? + +layout: FormTableRowLayout? - - - +Widget build() - -Widget _buildPopupMenu() + + + + + + + + Widget Function(BuildContext)? - - - + + + + - - - Axis + + + FormTableRowLayout + + + + + + +index: int + <static>+values: List<FormTableRowLayout> + <static>+vertical: FormTableRowLayout + <static>+horizontal: FormTableRowLayout - - - + + + + + - - - PopupMenuPosition + + + FormTableLayout + + + + + + +rows: List<FormTableRow> + +columnWidths: Map<int, TableColumnWidth> + +rowDivider: Widget? + +rowLayout: FormTableRowLayout? + +rowLabelStyle: TextStyle? + + + + + + +Widget build() - - - - - + + + + + - - - AsyncValueWidget + + + FormSectionHeader - - - +value: AsyncValue<T> - +data: Widget Function(T) - +error: Widget Function(Object, StackTrace?)? - +loading: Widget Function()? - +empty: Widget Function()? + + + +title: String + +titleTextStyle: TextStyle? + +helpText: String? + +divider: bool + +helpTextDisabled: bool - - - +Widget build() - -Widget _buildDataOrEmptyWidget() - -Widget _defaultError() - -Widget _defaultLoad() + + + +Widget build() - - - + + + + + - - - Widget Function(Object, StackTrace?)? + + + FormLabel - - - - + + + +labelText: String? + +helpText: String? + +labelTextStyle: TextStyle? + +layout: FormTableRowLayout? + + - - - Widget Function()? + + + +Widget build() diff --git a/docs/uml/designer_v2/lib/domain/uml.svg b/docs/uml/designer_v2/lib/domain/uml.svg index 7347d0e77..f805ecdb6 100644 --- a/docs/uml/designer_v2/lib/domain/uml.svg +++ b/docs/uml/designer_v2/lib/domain/uml.svg @@ -1,5 +1,29 @@ - - [<abstract>ResultTypes + + [StudyTemplates + | + <static>+kUnnamedStudyTitle: String + | + <static>+Study emptyDraft() + ] + + [StudyActionType + | + +index: int; + <static>+values: List<StudyActionType>; + <static>+pin: StudyActionType; + <static>+pinoff: StudyActionType; + <static>+edit: StudyActionType; + <static>+duplicate: StudyActionType; + <static>+duplicateDraft: StudyActionType; + <static>+addCollaborator: StudyActionType; + <static>+export: StudyActionType; + <static>+delete: StudyActionType + ] + + [StudyActionType]o-[StudyActionType] + [Enum]<:--[StudyActionType] + + [<abstract>ResultTypes ] [MeasurementResultTypes @@ -28,57 +52,98 @@ [StudyExportData]o-[Study] - [StudyTemplates - | - <static>+kUnnamedStudyTitle: String - | - <static>+Study emptyDraft() - ] - - [StudyActionType - | - +index: int; - <static>+values: List<StudyActionType>; - <static>+edit: StudyActionType; - <static>+duplicate: StudyActionType; - <static>+duplicateDraft: StudyActionType; - <static>+addCollaborator: StudyActionType; - <static>+export: StudyActionType; - <static>+delete: StudyActionType - ] - - [StudyActionType]o-[StudyActionType] - [Enum]<:--[StudyActionType] - - + - - - - - - + + - + + + + - + + + + + + - + - - + + + + + + + + + StudyTemplates + + + + + + <static>+kUnnamedStudyTitle: String + + + + + + <static>+Study emptyDraft() + + + + + + + + + + + + StudyActionType + + + + + + +index: int + <static>+values: List<StudyActionType> + <static>+pin: StudyActionType + <static>+pinoff: StudyActionType + <static>+edit: StudyActionType + <static>+duplicate: StudyActionType + <static>+duplicateDraft: StudyActionType + <static>+addCollaborator: StudyActionType + <static>+export: StudyActionType + <static>+delete: StudyActionType + + + + + + + + + + + Enum + + + - - + - + ResultTypes @@ -87,16 +152,16 @@ - - + + - + MeasurementResultTypes - + <static>+questionnaire: String <static>+values: List<String> @@ -106,16 +171,16 @@ - - + + - + InterventionResultTypes - + <static>+checkmarkTask: String <static>+values: List<String> @@ -125,16 +190,16 @@ - - + + - + StudyExportData - + +study: Study +measurementsData: List<Map<String, dynamic>> @@ -146,76 +211,15 @@ - + - + Study - - - - - - - - - StudyTemplates - - - - - - <static>+kUnnamedStudyTitle: String - - - - - - <static>+Study emptyDraft() - - - - - - - - - - - - StudyActionType - - - - - - +index: int - <static>+values: List<StudyActionType> - <static>+edit: StudyActionType - <static>+duplicate: StudyActionType - <static>+duplicateDraft: StudyActionType - <static>+addCollaborator: StudyActionType - <static>+export: StudyActionType - <static>+delete: StudyActionType - - - - - - - - - - - Enum - - - - diff --git a/docs/uml/designer_v2/lib/features/auth/uml.svg b/docs/uml/designer_v2/lib/features/auth/uml.svg index d78167a48..1774ab483 100644 --- a/docs/uml/designer_v2/lib/features/auth/uml.svg +++ b/docs/uml/designer_v2/lib/features/auth/uml.svg @@ -1,4 +1,4 @@ - + [AuthScaffold | +body: Widget; @@ -12,26 +12,6 @@ [AuthScaffold]o-[AuthFormKey] [AuthScaffold]o-[EdgeInsets] - [PasswordRecoveryForm - | - +formKey: AuthFormKey - | - +Widget build() - ] - - [PasswordRecoveryForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] - - [LoginForm - | - +formKey: AuthFormKey - | - +Widget build() - ] - - [LoginForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[LoginForm] - [SignupForm | +formKey: AuthFormKey @@ -44,21 +24,26 @@ [SignupForm]o-[AuthFormKey] [<abstract>FormConsumerRefWidget]<:-[SignupForm] - [PasswordForgotForm + [PasswordRecoveryForm | +formKey: AuthFormKey | +Widget build() ] - [PasswordForgotForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] + [PasswordRecoveryForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] - [StudyUJobsToBeDone + [PasswordForgotForm + | + +formKey: AuthFormKey | +Widget build() ] + [PasswordForgotForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] + [AuthFormController | +authRepository: IAuthRepository; @@ -142,110 +127,125 @@ [PasswordTextField]o-[FormControl] + [StudyUJobsToBeDone + | + +Widget build() + ] + + [LoginForm + | + +formKey: AuthFormKey + | + +Widget build() + ] + + [LoginForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[LoginForm] + - + - - + + - + - + - + - + - + - + - + - - - + + + - + - - - + + + - + - - - + + + - + - - - + - + - + - + - + - + - + - + - + - + - + - - - - - + - + - - + + - + - + + + + + + - - + - + - + - + + + - - + + - + AuthScaffold - + +body: Widget +formKey: AuthFormKey @@ -258,9 +258,9 @@ - + - + Widget @@ -269,16 +269,16 @@ - - + + - + AuthFormKey - + +index: int <static>+values: List<AuthFormKey> @@ -294,159 +294,116 @@ - + - + EdgeInsets - - - - - + + + + + - - - PasswordRecoveryForm + + + SignupForm - - - +formKey: AuthFormKey + + + +formKey: AuthFormKey - - - +Widget build() + + + +Widget build() + -dynamic _onClickTermsOfUse() + -dynamic _onClickPrivacyPolicy() - + - + FormConsumerRefWidget - - - - - - - - - LoginForm - - - - - - +formKey: AuthFormKey - - - - - - +Widget build() - - - - - - - - - + + + + + - - - SignupForm + + + PasswordRecoveryForm - - - +formKey: AuthFormKey + + + +formKey: AuthFormKey - - - +Widget build() - -dynamic _onClickTermsOfUse() - -dynamic _onClickPrivacyPolicy() + + + +Widget build() - - - + + + - + PasswordForgotForm - + +formKey: AuthFormKey - + +Widget build() - - - - - - - - StudyUJobsToBeDone - - - - - - +Widget build() - - - - - - - + + + - + AuthFormController - + +authRepository: IAuthRepository +sharedPreferences: SharedPreferences @@ -470,7 +427,7 @@ - + -dynamic _onChangeFormKey() +dynamic resetControlsFor() @@ -493,9 +450,9 @@ - + - + IAuthRepository @@ -504,9 +461,9 @@ - + - + SharedPreferences @@ -515,9 +472,9 @@ - + - + INotificationService @@ -526,9 +483,9 @@ - + - + GoRouter @@ -537,9 +494,9 @@ - + - + FormControl @@ -548,9 +505,9 @@ - + - + FormGroup @@ -559,9 +516,9 @@ - + - + IFormGroupController @@ -570,9 +527,9 @@ - + - + Enum @@ -581,16 +538,16 @@ - - + + - + EmailTextField - + +labelText: String +hintText: String? @@ -602,16 +559,16 @@ - - + + - + PasswordTextField - + +labelText: String +hintText: String? @@ -621,6 +578,49 @@ + + + + + + + + StudyUJobsToBeDone + + + + + + +Widget build() + + + + + + + + + + + + + LoginForm + + + + + + +formKey: AuthFormKey + + + + + + +Widget build() + + + + diff --git a/docs/uml/designer_v2/lib/features/dashboard/uml.svg b/docs/uml/designer_v2/lib/features/dashboard/uml.svg index 8ef8d1491..ccec9ae80 100644 --- a/docs/uml/designer_v2/lib/features/dashboard/uml.svg +++ b/docs/uml/designer_v2/lib/features/dashboard/uml.svg @@ -1,27 +1,45 @@ - - [StudiesFilter + + [DashboardController | - +index: int; - <static>+values: List<StudiesFilter> - ] - - [Enum]<:--[StudiesFilter] - - [DashboardScaffold - | - +body: Widget + +studyRepository: IStudyRepository; + +authRepository: IAuthRepository; + +userRepository: IUserRepository; + +router: GoRouter; + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>?; + +searchController: SearchController | - +Widget build() + -dynamic _subscribeStudies(); + +dynamic setSearchText(); + +dynamic setStudiesFilter(); + +dynamic onSelectStudy(); + +dynamic onClickNewStudy(); + +dynamic pinStudy(); + +dynamic pinOffStudy(); + +void filterStudies(); + +void sortStudies(); + +bool isPinned(); + +List<ModelAction<dynamic>> availableActions(); + +void dispose() ] - [DashboardScaffold]o-[<abstract>Widget] + [DashboardController]o-[<abstract>IStudyRepository] + [DashboardController]o-[<abstract>IAuthRepository] + [DashboardController]o-[<abstract>IUserRepository] + [DashboardController]o-[GoRouter] + [DashboardController]o-[StreamSubscription] + [DashboardController]o-[SearchController] + [<abstract>IModelActionProvider]<:--[DashboardController] [StudiesTable | +studies: List<Study>; +onSelect: void Function(Study); +getActions: List<ModelAction<dynamic>> Function(Study); - +emptyWidget: Widget + +emptyWidget: Widget; + +pinnedStudies: Iterable<String>; + +dashboardController: DashboardController; + +pinnedPredicates: int Function(Study, Study); + -_sortColumns: List<int Function(Study, Study)?> | +Widget build(); -List<Widget> _buildRow() @@ -30,175 +48,245 @@ [StudiesTable]o-[void Function(Study)] [StudiesTable]o-[List<ModelAction<dynamic>> Function(Study)] [StudiesTable]o-[<abstract>Widget] + [StudiesTable]o-[DashboardController] + [StudiesTable]o-[int Function(Study, Study)] - [DashboardScreen + [DashboardScaffold | - +filter: StudiesFilter? + +body: Widget + | + +Widget build() ] - [DashboardScreen]o-[StudiesFilter] + [DashboardScaffold]o-[<abstract>Widget] - [DashboardController + [StudiesFilter | - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +router: GoRouter; - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + +index: int; + <static>+values: List<StudiesFilter> + ] + + [Enum]<:--[StudiesFilter] + + [DashboardScreen | - -dynamic _subscribeStudies(); - +dynamic setStudiesFilter(); - +dynamic onSelectStudy(); - +dynamic onClickNewStudy(); - +List<ModelAction<dynamic>> availableActions(); - +void dispose() + +filter: StudiesFilter? ] - [DashboardController]o-[<abstract>IStudyRepository] - [DashboardController]o-[<abstract>IAuthRepository] - [DashboardController]o-[GoRouter] - [DashboardController]o-[StreamSubscription] - [<abstract>IModelActionProvider]<:--[DashboardController] + [DashboardScreen]o-[StudiesFilter] - + - + - - - + + + + - - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + - + - + - + - + - + - + - + + + + + - + - - - - - + + + + + + + + + + - - - StudiesFilter + + + DashboardController - - - +index: int - <static>+values: List<StudiesFilter> + + + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +userRepository: IUserRepository + +router: GoRouter + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + +searchController: SearchController + + + + + + -dynamic _subscribeStudies() + +dynamic setSearchText() + +dynamic setStudiesFilter() + +dynamic onSelectStudy() + +dynamic onClickNewStudy() + +dynamic pinStudy() + +dynamic pinOffStudy() + +void filterStudies() + +void sortStudies() + +bool isPinned() + +List<ModelAction<dynamic>> availableActions() + +void dispose() - - - + + + - - - Enum + + + IStudyRepository - - - - - + + + - - - DashboardScaffold + + + IAuthRepository - - - +body: Widget + + + + + + + + IUserRepository - - - +Widget build() + + + + + + + + GoRouter - - - + + + - - - Widget + + + StreamSubscription + + + + + + + + + + + SearchController + + + + + + + + + + + IModelActionProvider - - - + + + - + StudiesTable - + +studies: List<Study> +onSelect: void Function(Study) +getActions: List<ModelAction<dynamic>> Function(Study) +emptyWidget: Widget + +pinnedStudies: Iterable<String> + +dashboardController: DashboardController + +pinnedPredicates: int Function(Study, Study) + -_sortColumns: List<int Function(Study, Study)?> - + +Widget build() -List<Widget> _buildRow() @@ -208,9 +296,9 @@ - + - + void Function(Study) @@ -219,117 +307,106 @@ - + - + List<ModelAction<dynamic>> Function(Study) - - - - + + + - - - DashboardScreen + + + Widget - - - +filter: StudiesFilter? + + + + + + + + int Function(Study, Study) - - - - - + + + + + - - - DashboardController + + + DashboardScaffold - - - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +router: GoRouter - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + + + +body: Widget - - - -dynamic _subscribeStudies() - +dynamic setStudiesFilter() - +dynamic onSelectStudy() - +dynamic onClickNewStudy() - +List<ModelAction<dynamic>> availableActions() - +void dispose() + + + +Widget build() - - - + + + + - - - IStudyRepository + + + StudiesFilter - - - - - - - - IAuthRepository + + + +index: int + <static>+values: List<StudiesFilter> - - - + + + - - - GoRouter + + + Enum - - - + + + + - - - StreamSubscription + + + DashboardScreen - - - - - - - - IModelActionProvider + + + +filter: StudiesFilter? diff --git a/docs/uml/designer_v2/lib/features/design/enrollment/uml.svg b/docs/uml/designer_v2/lib/features/design/enrollment/uml.svg index 71bc20025..955c6ad8f 100644 --- a/docs/uml/designer_v2/lib/features/design/enrollment/uml.svg +++ b/docs/uml/designer_v2/lib/features/design/enrollment/uml.svg @@ -1,10 +1,26 @@ - - [ConsentItemFormView + + [StudyDesignEnrollmentFormView | - +formViewModel: ConsentItemFormViewModel + +Widget build(); + -dynamic _showScreenerQuestionSidesheetWithArgs(); + -dynamic _showConsentItemSidesheetWithArgs() ] - [ConsentItemFormView]o-[ConsentItemFormViewModel] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] + + [ConsentItemFormData + | + +consentId: String; + +title: String; + +description: String; + +iconName: String?; + +id: String + | + +ConsentItem toConsentItem(); + +ConsentItemFormData copy() + ] + + [<abstract>IFormData]<:-[ConsentItemFormData] [EnrollmentFormData | @@ -22,15 +38,6 @@ [EnrollmentFormData]o-[QuestionnaireFormData] [<abstract>IStudyFormData]<:--[EnrollmentFormData] - [StudyDesignEnrollmentFormView - | - +Widget build(); - -dynamic _showScreenerQuestionSidesheetWithArgs(); - -dynamic _showConsentItemSidesheetWithArgs() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] - [ConsentItemFormViewModel | +consentIdControl: FormControl<String>; @@ -166,205 +173,216 @@ [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] - [ConsentItemFormData + [ConsentItemFormView | - +consentId: String; - +title: String; - +description: String; - +iconName: String?; - +id: String - | - +ConsentItem toConsentItem(); - +ConsentItemFormData copy() + +formViewModel: ConsentItemFormViewModel ] - [<abstract>IFormData]<:-[ConsentItemFormData] + [ConsentItemFormView]o-[ConsentItemFormViewModel] - + - + - - + + + + + + - + - + - - - - - + - + - - - - + + - + - + - + - - - + + + - + - - - + + + - + - - + + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - - - - - - - + + + + + + + + + - - - ConsentItemFormView + + + StudyDesignEnrollmentFormView - - - +formViewModel: ConsentItemFormViewModel + + + +Widget build() + -dynamic _showScreenerQuestionSidesheetWithArgs() + -dynamic _showConsentItemSidesheetWithArgs() - - - - - + + + - - - ConsentItemFormViewModel + + + StudyDesignPageWidget - - - +consentIdControl: FormControl<String> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +iconControl: FormControl<IconOption> - +form: FormGroup - +consentId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +titles: Map<FormMode, String> + + + + + + + + + + ConsentItemFormData - - - +void setControlsFrom() - +ConsentItemFormData buildFormData() - +ConsentItemFormViewModel createDuplicate() + + + +consentId: String + +title: String + +description: String + +iconName: String? + +id: String + + + + + + +ConsentItem toConsentItem() + +ConsentItemFormData copy() + + + + + + + + + + + IFormData - - - + + + - + EnrollmentFormData - + <static>+kDefaultEnrollmentType: Participation +enrollmentType: Participation @@ -374,7 +392,7 @@ - + +Study apply() +EnrollmentFormData copy() @@ -384,9 +402,9 @@ - + - + Participation @@ -395,9 +413,9 @@ - + - + QuestionnaireFormData @@ -406,51 +424,56 @@ - + - + IStudyFormData - - - - + + + + + - - - StudyDesignEnrollmentFormView + + + ConsentItemFormViewModel - - - +Widget build() - -dynamic _showScreenerQuestionSidesheetWithArgs() - -dynamic _showConsentItemSidesheetWithArgs() + + + +consentIdControl: FormControl<String> + +titleControl: FormControl<String> + +descriptionControl: FormControl<String> + +iconControl: FormControl<IconOption> + +form: FormGroup + +consentId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +titles: Map<FormMode, String> - - - - - - - - StudyDesignPageWidget + + + +void setControlsFrom() + +ConsentItemFormData buildFormData() + +ConsentItemFormViewModel createDuplicate() - + - + FormControl @@ -459,9 +482,9 @@ - + - + FormGroup @@ -470,9 +493,9 @@ - + - + ManagedFormViewModel @@ -481,16 +504,16 @@ - - + + - + IScreenerQuestionLogicFormViewModel - + +isDirtyOptionsBannerVisible: bool @@ -499,23 +522,23 @@ - - - + + + - + ScreenerQuestionLogicFormView - + +formViewModel: ScreenerQuestionFormViewModel - + +Widget build() -dynamic _buildInfoBanner() @@ -527,17 +550,17 @@ - - - + + + - + ScreenerQuestionFormViewModel - + <static>+defaultResponseOptionValidity: bool +responseOptionsDisabledArray: FormArray<dynamic> @@ -553,7 +576,7 @@ - + +dynamic onResponseOptionsChanged() +void setControlsFrom() @@ -568,9 +591,9 @@ - + - + FormConsumerWidget @@ -579,9 +602,9 @@ - + - + FormArray @@ -590,9 +613,9 @@ - + - + QuestionFormViewModel @@ -601,17 +624,17 @@ - - - + + + - + EnrollmentFormViewModel - + +study: Study +router: GoRouter @@ -630,7 +653,7 @@ - + +void setControlsFrom() +EnrollmentFormData buildFormData() @@ -653,9 +676,9 @@ - + - + Study @@ -664,9 +687,9 @@ - + - + GoRouter @@ -675,17 +698,17 @@ - - - + + + - + EnrollmentFormConsentItemDelegate - + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> +owner: EnrollmentFormViewModel @@ -694,7 +717,7 @@ - + +void onCancel() +dynamic onSave() @@ -708,9 +731,9 @@ - + - + FormViewModelCollection @@ -719,9 +742,9 @@ - + - + FormViewModel @@ -730,9 +753,9 @@ - + - + WithQuestionnaireControls @@ -741,9 +764,9 @@ - + - + IFormViewModelDelegate @@ -752,9 +775,9 @@ - + - + IListActionProvider @@ -763,52 +786,29 @@ - + - + IProviderArgsResolver - - - - - - - - - ConsentItemFormData - - - - - - +consentId: String - +title: String - +description: String - +iconName: String? - +id: String - - + + + + - - - +ConsentItem toConsentItem() - +ConsentItemFormData copy() + + + ConsentItemFormView - - - - - - - - IFormData + + + +formViewModel: ConsentItemFormViewModel diff --git a/docs/uml/designer_v2/lib/features/design/info/uml.svg b/docs/uml/designer_v2/lib/features/design/info/uml.svg index 73fec0c28..580464fbd 100644 --- a/docs/uml/designer_v2/lib/features/design/info/uml.svg +++ b/docs/uml/designer_v2/lib/features/design/info/uml.svg @@ -1,38 +1,5 @@ - - [StudyInfoFormData - | - +title: String; - +description: String?; - +iconName: String; - +contactInfoFormData: StudyContactInfoFormData; - +id: String - | - +Study apply(); - +StudyInfoFormData copy() - ] - - [StudyInfoFormData]o-[StudyContactInfoFormData] - [<abstract>IStudyFormData]<:--[StudyInfoFormData] - - [StudyContactInfoFormData - | - +organization: String?; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String?; - +website: String?; - +phone: String?; - +additionalInfo: String?; - +id: String - | - +Study apply(); - +StudyInfoFormData copy() - ] - - [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - - [StudyDesignInfoFormView + + [StudyDesignInfoFormView | +Widget build() ] @@ -77,129 +44,87 @@ [StudyInfoFormViewModel]o-[FormGroup] [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] + [StudyInfoFormData + | + +title: String; + +description: String?; + +iconName: String; + +contactInfoFormData: StudyContactInfoFormData; + +id: String + | + +Study apply(); + +StudyInfoFormData copy() + ] + + [StudyInfoFormData]o-[StudyContactInfoFormData] + [<abstract>IStudyFormData]<:--[StudyInfoFormData] + + [StudyContactInfoFormData + | + +organization: String?; + +institutionalReviewBoard: String?; + +institutionalReviewBoardNumber: String?; + +researchers: String?; + +email: String?; + +website: String?; + +phone: String?; + +additionalInfo: String?; + +id: String + | + +Study apply(); + +StudyInfoFormData copy() + ] + + [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] + - + - + + + - - - - + - - - - - - - - + - + - + - + - + + + - + - - - - - - - - - - - StudyInfoFormData - - - - - - +title: String - +description: String? - +iconName: String - +contactInfoFormData: StudyContactInfoFormData - +id: String - - - - - - +Study apply() - +StudyInfoFormData copy() - - - - - - - - - - - - - StudyContactInfoFormData - - - - - - +organization: String? - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String? - +website: String? - +phone: String? - +additionalInfo: String? - +id: String - - - - - - +Study apply() - +StudyInfoFormData copy() - - - + + - - - - - - - IStudyFormData - - - + + + + - - + + - + StudyDesignInfoFormView - + +Widget build() @@ -208,9 +133,9 @@ - + - + StudyDesignPageWidget @@ -219,17 +144,17 @@ - - - + + + - + StudyInfoFormViewModel - + +study: Study +titleControl: FormControl<String> @@ -260,7 +185,7 @@ - + +void setControlsFrom() +StudyInfoFormData buildFormData() @@ -270,9 +195,9 @@ - + - + Study @@ -281,9 +206,9 @@ - + - + FormControl @@ -292,9 +217,9 @@ - + - + FormGroup @@ -303,15 +228,90 @@ - + - + FormViewModel + + + + + + + + + StudyInfoFormData + + + + + + +title: String + +description: String? + +iconName: String + +contactInfoFormData: StudyContactInfoFormData + +id: String + + + + + + +Study apply() + +StudyInfoFormData copy() + + + + + + + + + + + + + StudyContactInfoFormData + + + + + + +organization: String? + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String? + +website: String? + +phone: String? + +additionalInfo: String? + +id: String + + + + + + +Study apply() + +StudyInfoFormData copy() + + + + + + + + + + + IStudyFormData + + + + diff --git a/docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/types/uml.svg b/docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/types/uml.svg index 26f2ca3d1..5cb20f421 100644 --- a/docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/types/uml.svg +++ b/docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/types/uml.svg @@ -1,17 +1,5 @@ - [<abstract>IScaleQuestionFormViewModel - | - +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView - | - +formViewModel: QuestionFormViewModel - ] - - [ScaleQuestionFormView]o-[QuestionFormViewModel] - - [SurveyQuestionType + [SurveyQuestionType | +index: int; <static>+values: List<SurveyQuestionType>; @@ -23,6 +11,16 @@ [SurveyQuestionType]o-[SurveyQuestionType] [Enum]<:--[SurveyQuestionType] + [ChoiceQuestionFormView + | + +formViewModel: QuestionFormViewModel + | + +Widget build() + ] + + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [BoolQuestionFormView | +formViewModel: QuestionFormViewModel @@ -33,15 +31,17 @@ [BoolQuestionFormView]o-[QuestionFormViewModel] [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - [ChoiceQuestionFormView + [<abstract>IScaleQuestionFormViewModel | - +formViewModel: QuestionFormViewModel + +isMidValuesClearedInfoVisible: bool + ] + + [ScaleQuestionFormView | - +Widget build() + +formViewModel: QuestionFormViewModel ] - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [ScaleQuestionFormView]o-[QuestionFormViewModel] @@ -50,63 +50,85 @@ - - - - - - + + - + - + + + + + + - + + - - - + + + - + - - - - - - + + + + - - - IScaleQuestionFormViewModel + + + SurveyQuestionType - - - +isMidValuesClearedInfoVisible: bool + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType - - - - + + + - - - ScaleQuestionFormView + + + Enum - - - +formViewModel: QuestionFormViewModel + + + + + + + + + + ChoiceQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() @@ -122,35 +144,13 @@ - - - - - - - - SurveyQuestionType - - - - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType - - - - - - - + + + - - - Enum + + + ConsumerWidget @@ -180,38 +180,38 @@ - - - + + + + - - - ConsumerWidget + + + IScaleQuestionFormViewModel - - - - - - - - - - ChoiceQuestionFormView + + + +isMidValuesClearedInfoVisible: bool - - - +formViewModel: QuestionFormViewModel + + + + + + + + + ScaleQuestionFormView - - - +Widget build() + + + +formViewModel: QuestionFormViewModel diff --git a/docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/uml.svg b/docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/uml.svg index f2b9959ba..546c7e447 100644 --- a/docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/uml.svg +++ b/docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/uml.svg @@ -1,80 +1,47 @@ - - [QuestionFormViewModel + + [SurveyQuestionType + | + +index: int; + <static>+values: List<SurveyQuestionType>; + <static>+choice: SurveyQuestionType; + <static>+bool: SurveyQuestionType; + <static>+scale: SurveyQuestionType + ] + + [SurveyQuestionType]o-[SurveyQuestionType] + [Enum]<:--[SurveyQuestionType] + + [ChoiceQuestionFormView + | + +formViewModel: QuestionFormViewModel + | + +Widget build() + ] + + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + + [BoolQuestionFormView + | + +formViewModel: QuestionFormViewModel + | + +Widget build() + ] + + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] + + [<abstract>IScaleQuestionFormViewModel | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +form: FormGroup; - +questionId: String; - +questionType: SurveyQuestionType; - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; - +answerOptionsArray: FormArray<dynamic>; - +answerOptionsControls: List<AbstractControl<dynamic>>; - +validAnswerOptions: List<String>; - +boolOptions: List<AbstractControl<String>>; - +scaleMinValue: int; - +scaleMaxValue: int; - +scaleRange: int; - +scaleAllValueControls: List<AbstractControl<int>>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +questionTextRequired: dynamic; - +numValidChoiceOptions: dynamic; - +scaleRangeValid: dynamic; - +titles: Map<FormMode, String>; - +isAddOptionButtonVisible: bool; +isMidValuesClearedInfoVisible: bool + ] + + [ScaleQuestionFormView | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); - +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem(); - +QuestionFormViewModel createDuplicate() + +formViewModel: QuestionFormViewModel ] - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + [ScaleQuestionFormView]o-[QuestionFormViewModel] [<abstract>QuestionFormData | @@ -146,49 +113,82 @@ [ScaleQuestionFormData]o-[Color] [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] - [<abstract>IScaleQuestionFormViewModel + [QuestionFormViewModel | + <static>+defaultQuestionType: SurveyQuestionType; + -_titles: Map<FormMode, String Function()>?; + +questionIdControl: FormControl<String>; + +questionTypeControl: FormControl<SurveyQuestionType>; + +questionTextControl: FormControl<String>; + +questionInfoTextControl: FormControl<String>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isMultipleChoiceControl: FormControl<bool>; + +choiceResponseOptionsArray: FormArray<dynamic>; + +customOptionsMin: int; + +customOptionsMax: int; + +customOptionsInitial: int; + +boolResponseOptionsArray: FormArray<String>; + <static>+kDefaultScaleMinValue: int; + <static>+kDefaultScaleMaxValue: int; + <static>+kNumMidValueControls: int; + <static>+kMidValueDebounceMilliseconds: int; + +scaleMinValueControl: FormControl<int>; + +scaleMaxValueControl: FormControl<int>; + -_scaleRangeControl: FormControl<int>; + +scaleMinLabelControl: FormControl<String>; + +scaleMaxLabelControl: FormControl<String>; + +scaleMidValueControls: FormArray<int>; + +scaleMidLabelControls: FormArray<String?>; + -_scaleResponseOptionsArray: FormArray<int>; + +scaleMinColorControl: FormControl<SerializableColor>; + +scaleMaxColorControl: FormControl<SerializableColor>; + +prevMidValues: List<int?>?; + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +form: FormGroup; + +questionId: String; + +questionType: SurveyQuestionType; + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; + +answerOptionsArray: FormArray<dynamic>; + +answerOptionsControls: List<AbstractControl<dynamic>>; + +validAnswerOptions: List<String>; + +boolOptions: List<AbstractControl<String>>; + +scaleMinValue: int; + +scaleMaxValue: int; + +scaleRange: int; + +scaleAllValueControls: List<AbstractControl<int>>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +questionTextRequired: dynamic; + +numValidChoiceOptions: dynamic; + +scaleRangeValid: dynamic; + +titles: Map<FormMode, String>; + +isAddOptionButtonVisible: bool; +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView - | - +formViewModel: QuestionFormViewModel - ] - - [ScaleQuestionFormView]o-[QuestionFormViewModel] - - [SurveyQuestionType | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType - ] - - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] - - [BoolQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - - [ChoiceQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() + +String? scaleMidLabelAt(); + -dynamic _onScaleRangeChanged(); + -dynamic _applyInputFormatters(); + -dynamic _updateScaleMidValueControls(); + -List<FormControlValidation> _getValidationConfig(); + +dynamic onQuestionTypeChanged(); + +dynamic onResponseOptionsChanged(); + -void _updateFormControls(); + +void initControls(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem(); + +QuestionFormViewModel createDuplicate() ] - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] [SurveyQuestionFormView | @@ -202,91 +202,149 @@ - + - + + + + + + + + + - + - + + + - + - + + + - + - + - + - - - + + + + + + + + + + - - + + + - + - - - - - - - - - + - + - - - + - + - + - + + + - + - - + + - + - - - - - + + + + + + + + SurveyQuestionType + + + + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType + + + - - - - - + + + + + + + Enum + + + + + + + + + + + + + ChoiceQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() + + + - - - + + + - + QuestionFormViewModel - + <static>+defaultQuestionType: SurveyQuestionType -_titles: Map<FormMode, String Function()>? @@ -341,7 +399,7 @@ - + +String? scaleMidLabelAt() -dynamic _onScaleRangeChanged() @@ -362,96 +420,91 @@ - - - - + + + - - - SurveyQuestionType + + + ConsumerWidget - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType + + + + + + + + + + BoolQuestionFormView - - - - + + + +formViewModel: QuestionFormViewModel + + - - - FormControl + + + +Widget build() - - - + + + + - - - FormArray + + + IScaleQuestionFormViewModel - - - - - - - - FormGroup + + + +isMidValuesClearedInfoVisible: bool - - - + + + + - - - ManagedFormViewModel + + + ScaleQuestionFormView - - - - - - - - IListActionProvider + + + +formViewModel: QuestionFormViewModel - - - + + + - + QuestionFormData - + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> +questionId: String @@ -464,7 +517,7 @@ - + +Question<dynamic> toQuestion() +EligibilityCriterion toEligibilityCriterion() @@ -477,9 +530,9 @@ - + - + IFormData @@ -488,17 +541,17 @@ - - - + + + - + ChoiceQuestionFormData - + +isMultipleChoice: bool +answerOptions: List<String> @@ -506,7 +559,7 @@ - + +Question<dynamic> toQuestion() +QuestionFormData copy() @@ -518,24 +571,24 @@ - - - + + + - + BoolQuestionFormData - + <static>+kResponseOptions: Map<String, bool> +responseOptions: List<String> - + +Question<dynamic> toQuestion() +BoolQuestionFormData copy() @@ -546,17 +599,17 @@ - - - + + + - + ScaleQuestionFormData - + +minValue: double +maxValue: double @@ -573,7 +626,7 @@ - + +ScaleQuestion toQuestion() +QuestionFormData copy() @@ -584,135 +637,82 @@ - + - + Color - - - - - - - - IScaleQuestionFormViewModel - - - - - - +isMidValuesClearedInfoVisible: bool - - - - - - - - - - - - ScaleQuestionFormView - - + + + - - - +formViewModel: QuestionFormViewModel + + + FormControl - - - + + + - - - Enum + + + FormArray - - - - - - - - - BoolQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - + + + - - - +Widget build() + + + FormGroup - - - + + + - - - ConsumerWidget + + + ManagedFormViewModel - - - - - - - - - ChoiceQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - + + + - - - +Widget build() + + + IListActionProvider - - + + - + SurveyQuestionFormView - + +formViewModel: QuestionFormViewModel +isHtmlStyleable: bool diff --git a/docs/uml/designer_v2/lib/features/design/shared/questionnaire/uml.svg b/docs/uml/designer_v2/lib/features/design/shared/questionnaire/uml.svg index 032c61e39..3de3c6555 100644 --- a/docs/uml/designer_v2/lib/features/design/shared/questionnaire/uml.svg +++ b/docs/uml/designer_v2/lib/features/design/shared/questionnaire/uml.svg @@ -1,80 +1,47 @@ - - [QuestionFormViewModel + + [SurveyQuestionType + | + +index: int; + <static>+values: List<SurveyQuestionType>; + <static>+choice: SurveyQuestionType; + <static>+bool: SurveyQuestionType; + <static>+scale: SurveyQuestionType + ] + + [SurveyQuestionType]o-[SurveyQuestionType] + [Enum]<:--[SurveyQuestionType] + + [ChoiceQuestionFormView + | + +formViewModel: QuestionFormViewModel + | + +Widget build() + ] + + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + + [BoolQuestionFormView + | + +formViewModel: QuestionFormViewModel + | + +Widget build() + ] + + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] + + [<abstract>IScaleQuestionFormViewModel | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +form: FormGroup; - +questionId: String; - +questionType: SurveyQuestionType; - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; - +answerOptionsArray: FormArray<dynamic>; - +answerOptionsControls: List<AbstractControl<dynamic>>; - +validAnswerOptions: List<String>; - +boolOptions: List<AbstractControl<String>>; - +scaleMinValue: int; - +scaleMaxValue: int; - +scaleRange: int; - +scaleAllValueControls: List<AbstractControl<int>>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +questionTextRequired: dynamic; - +numValidChoiceOptions: dynamic; - +scaleRangeValid: dynamic; - +titles: Map<FormMode, String>; - +isAddOptionButtonVisible: bool; +isMidValuesClearedInfoVisible: bool + ] + + [ScaleQuestionFormView | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); - +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem(); - +QuestionFormViewModel createDuplicate() + +formViewModel: QuestionFormViewModel ] - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + [ScaleQuestionFormView]o-[QuestionFormViewModel] [<abstract>QuestionFormData | @@ -146,49 +113,82 @@ [ScaleQuestionFormData]o-[Color] [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] - [<abstract>IScaleQuestionFormViewModel + [QuestionFormViewModel | + <static>+defaultQuestionType: SurveyQuestionType; + -_titles: Map<FormMode, String Function()>?; + +questionIdControl: FormControl<String>; + +questionTypeControl: FormControl<SurveyQuestionType>; + +questionTextControl: FormControl<String>; + +questionInfoTextControl: FormControl<String>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isMultipleChoiceControl: FormControl<bool>; + +choiceResponseOptionsArray: FormArray<dynamic>; + +customOptionsMin: int; + +customOptionsMax: int; + +customOptionsInitial: int; + +boolResponseOptionsArray: FormArray<String>; + <static>+kDefaultScaleMinValue: int; + <static>+kDefaultScaleMaxValue: int; + <static>+kNumMidValueControls: int; + <static>+kMidValueDebounceMilliseconds: int; + +scaleMinValueControl: FormControl<int>; + +scaleMaxValueControl: FormControl<int>; + -_scaleRangeControl: FormControl<int>; + +scaleMinLabelControl: FormControl<String>; + +scaleMaxLabelControl: FormControl<String>; + +scaleMidValueControls: FormArray<int>; + +scaleMidLabelControls: FormArray<String?>; + -_scaleResponseOptionsArray: FormArray<int>; + +scaleMinColorControl: FormControl<SerializableColor>; + +scaleMaxColorControl: FormControl<SerializableColor>; + +prevMidValues: List<int?>?; + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +form: FormGroup; + +questionId: String; + +questionType: SurveyQuestionType; + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; + +answerOptionsArray: FormArray<dynamic>; + +answerOptionsControls: List<AbstractControl<dynamic>>; + +validAnswerOptions: List<String>; + +boolOptions: List<AbstractControl<String>>; + +scaleMinValue: int; + +scaleMaxValue: int; + +scaleRange: int; + +scaleAllValueControls: List<AbstractControl<int>>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +questionTextRequired: dynamic; + +numValidChoiceOptions: dynamic; + +scaleRangeValid: dynamic; + +titles: Map<FormMode, String>; + +isAddOptionButtonVisible: bool; +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView - | - +formViewModel: QuestionFormViewModel - ] - - [ScaleQuestionFormView]o-[QuestionFormViewModel] - - [SurveyQuestionType - | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType - ] - - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] - - [BoolQuestionFormView - | - +formViewModel: QuestionFormViewModel | - +Widget build() - ] - - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - - [ChoiceQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() + +String? scaleMidLabelAt(); + -dynamic _onScaleRangeChanged(); + -dynamic _applyInputFormatters(); + -dynamic _updateScaleMidValueControls(); + -List<FormControlValidation> _getValidationConfig(); + +dynamic onQuestionTypeChanged(); + +dynamic onResponseOptionsChanged(); + -void _updateFormControls(); + +void initControls(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem(); + +QuestionFormViewModel createDuplicate() ] - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] [SurveyQuestionFormView | @@ -198,18 +198,6 @@ [SurveyQuestionFormView]o-[QuestionFormViewModel] - [QuestionnaireFormData - | - +questionsData: List<QuestionFormData>?; - +id: String - | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() - ] - - [<abstract>IFormData]<:--[QuestionnaireFormData] - [<abstract>WithQuestionnaireControls | +questionsArray: FormArray<dynamic>; @@ -233,115 +221,185 @@ [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] + [QuestionnaireFormData + | + +questionsData: List<QuestionFormData>?; + +id: String + | + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() + ] + + [<abstract>IFormData]<:--[QuestionnaireFormData] + - + - + - + + + + + + + + + - + - + + + - + - + + + - + - + - + - - - + + + + + + + + + + - - + + + - + - - - - - - - - - + - + - - - + - + - + - + + + - + - - + + - + - - - + - + - - - + - + - - - - - - - - - - + + - + - + - + + + + + + + + + + + SurveyQuestionType + + + + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType + + + + + + + + + + + Enum + + + + + + + + + + + + + ChoiceQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() + + + - - - - + + + - + QuestionFormViewModel - + <static>+defaultQuestionType: SurveyQuestionType -_titles: Map<FormMode, String Function()>? @@ -396,7 +454,7 @@ - + +String? scaleMidLabelAt() -dynamic _onScaleRangeChanged() @@ -417,96 +475,91 @@ - - - - + + + - - - SurveyQuestionType + + + ConsumerWidget - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType + + + + + + + + + + BoolQuestionFormView - - - - + + + +formViewModel: QuestionFormViewModel + + - - - FormControl + + + +Widget build() - - - + + + + - - - FormArray + + + IScaleQuestionFormViewModel - - - - - - - - FormGroup + + + +isMidValuesClearedInfoVisible: bool - - - + + + + - - - ManagedFormViewModel + + + ScaleQuestionFormView - - - - - - - - IListActionProvider + + + +formViewModel: QuestionFormViewModel - - - + + + - + QuestionFormData - + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> +questionId: String @@ -519,7 +572,7 @@ - + +Question<dynamic> toQuestion() +EligibilityCriterion toEligibilityCriterion() @@ -532,9 +585,9 @@ - + - + IFormData @@ -543,17 +596,17 @@ - - - + + + - + ChoiceQuestionFormData - + +isMultipleChoice: bool +answerOptions: List<String> @@ -561,7 +614,7 @@ - + +Question<dynamic> toQuestion() +QuestionFormData copy() @@ -573,24 +626,24 @@ - - - + + + - + BoolQuestionFormData - + <static>+kResponseOptions: Map<String, bool> +responseOptions: List<String> - + +Question<dynamic> toQuestion() +BoolQuestionFormData copy() @@ -601,17 +654,17 @@ - - - + + + - + ScaleQuestionFormData - + +minValue: double +maxValue: double @@ -628,7 +681,7 @@ - + +ScaleQuestion toQuestion() +QuestionFormData copy() @@ -639,135 +692,82 @@ - + - + Color - - - - - - - - IScaleQuestionFormViewModel - - - - - - +isMidValuesClearedInfoVisible: bool - - - - - - - - - - - - ScaleQuestionFormView - - + + + - - - +formViewModel: QuestionFormViewModel + + + FormControl - - - + + + - - - Enum + + + FormArray - - - - - - - - - BoolQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - + + + - - - +Widget build() + + + FormGroup - - - + + + - - - ConsumerWidget + + + ManagedFormViewModel - - - - - - - - - ChoiceQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - + + + - - - +Widget build() + + + IListActionProvider - - + + - + SurveyQuestionFormView - + +formViewModel: QuestionFormViewModel +isHtmlStyleable: bool @@ -775,47 +775,19 @@ - - - - - - - - - QuestionnaireFormData - - - - - - +questionsData: List<QuestionFormData>? - +id: String - - - - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() - - - - - - - + + + - + WithQuestionnaireControls - + +questionsArray: FormArray<dynamic> +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> @@ -826,7 +798,7 @@ - + +void setQuestionnaireControlsFrom() +QuestionnaireFormData buildQuestionnaireFormData() @@ -841,9 +813,9 @@ - + - + FormViewModelCollection @@ -852,9 +824,9 @@ - + - + IFormViewModelDelegate @@ -863,15 +835,43 @@ - + - + IProviderArgsResolver + + + + + + + + + QuestionnaireFormData + + + + + + +questionsData: List<QuestionFormData>? + +id: String + + + + + + +StudyUQuestionnaire toQuestionnaire() + +List<EligibilityCriterion> toEligibilityCriteria() + +QuestionnaireFormData copy() + + + + diff --git a/docs/uml/designer_v2/lib/features/design/shared/uml.svg b/docs/uml/designer_v2/lib/features/design/shared/uml.svg index 200cb1c2f..2551dbdd2 100644 --- a/docs/uml/designer_v2/lib/features/design/shared/uml.svg +++ b/docs/uml/designer_v2/lib/features/design/shared/uml.svg @@ -1,4 +1,4 @@ - + [<abstract>WithScheduleControls | +isTimeRestrictedControl: FormControl<bool>; @@ -49,82 +49,49 @@ [ScheduleControls]o-[<abstract>WithScheduleControls] [<abstract>FormConsumerWidget]<:-[ScheduleControls] - [QuestionFormViewModel + [SurveyQuestionType + | + +index: int; + <static>+values: List<SurveyQuestionType>; + <static>+choice: SurveyQuestionType; + <static>+bool: SurveyQuestionType; + <static>+scale: SurveyQuestionType + ] + + [SurveyQuestionType]o-[SurveyQuestionType] + [Enum]<:--[SurveyQuestionType] + + [ChoiceQuestionFormView + | + +formViewModel: QuestionFormViewModel + | + +Widget build() + ] + + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + + [BoolQuestionFormView + | + +formViewModel: QuestionFormViewModel + | + +Widget build() + ] + + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] + + [<abstract>IScaleQuestionFormViewModel | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +form: FormGroup; - +questionId: String; - +questionType: SurveyQuestionType; - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; - +answerOptionsArray: FormArray<dynamic>; - +answerOptionsControls: List<AbstractControl<dynamic>>; - +validAnswerOptions: List<String>; - +boolOptions: List<AbstractControl<String>>; - +scaleMinValue: int; - +scaleMaxValue: int; - +scaleRange: int; - +scaleAllValueControls: List<AbstractControl<int>>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +questionTextRequired: dynamic; - +numValidChoiceOptions: dynamic; - +scaleRangeValid: dynamic; - +titles: Map<FormMode, String>; - +isAddOptionButtonVisible: bool; +isMidValuesClearedInfoVisible: bool + ] + + [ScaleQuestionFormView | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); - +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem(); - +QuestionFormViewModel createDuplicate() + +formViewModel: QuestionFormViewModel ] - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + [ScaleQuestionFormView]o-[QuestionFormViewModel] [<abstract>QuestionFormData | @@ -196,49 +163,82 @@ [ScaleQuestionFormData]o-[Color] [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] - [<abstract>IScaleQuestionFormViewModel + [QuestionFormViewModel | + <static>+defaultQuestionType: SurveyQuestionType; + -_titles: Map<FormMode, String Function()>?; + +questionIdControl: FormControl<String>; + +questionTypeControl: FormControl<SurveyQuestionType>; + +questionTextControl: FormControl<String>; + +questionInfoTextControl: FormControl<String>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isMultipleChoiceControl: FormControl<bool>; + +choiceResponseOptionsArray: FormArray<dynamic>; + +customOptionsMin: int; + +customOptionsMax: int; + +customOptionsInitial: int; + +boolResponseOptionsArray: FormArray<String>; + <static>+kDefaultScaleMinValue: int; + <static>+kDefaultScaleMaxValue: int; + <static>+kNumMidValueControls: int; + <static>+kMidValueDebounceMilliseconds: int; + +scaleMinValueControl: FormControl<int>; + +scaleMaxValueControl: FormControl<int>; + -_scaleRangeControl: FormControl<int>; + +scaleMinLabelControl: FormControl<String>; + +scaleMaxLabelControl: FormControl<String>; + +scaleMidValueControls: FormArray<int>; + +scaleMidLabelControls: FormArray<String?>; + -_scaleResponseOptionsArray: FormArray<int>; + +scaleMinColorControl: FormControl<SerializableColor>; + +scaleMaxColorControl: FormControl<SerializableColor>; + +prevMidValues: List<int?>?; + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +form: FormGroup; + +questionId: String; + +questionType: SurveyQuestionType; + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; + +answerOptionsArray: FormArray<dynamic>; + +answerOptionsControls: List<AbstractControl<dynamic>>; + +validAnswerOptions: List<String>; + +boolOptions: List<AbstractControl<String>>; + +scaleMinValue: int; + +scaleMaxValue: int; + +scaleRange: int; + +scaleAllValueControls: List<AbstractControl<int>>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +questionTextRequired: dynamic; + +numValidChoiceOptions: dynamic; + +scaleRangeValid: dynamic; + +titles: Map<FormMode, String>; + +isAddOptionButtonVisible: bool; +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView - | - +formViewModel: QuestionFormViewModel - ] - - [ScaleQuestionFormView]o-[QuestionFormViewModel] - - [SurveyQuestionType - | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType - ] - - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] - - [BoolQuestionFormView | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - - [ChoiceQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() + +String? scaleMidLabelAt(); + -dynamic _onScaleRangeChanged(); + -dynamic _applyInputFormatters(); + -dynamic _updateScaleMidValueControls(); + -List<FormControlValidation> _getValidationConfig(); + +dynamic onQuestionTypeChanged(); + +dynamic onResponseOptionsChanged(); + -void _updateFormControls(); + +void initControls(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem(); + +QuestionFormViewModel createDuplicate() ] - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] [SurveyQuestionFormView | @@ -248,18 +248,6 @@ [SurveyQuestionFormView]o-[QuestionFormViewModel] - [QuestionnaireFormData - | - +questionsData: List<QuestionFormData>?; - +id: String - | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() - ] - - [<abstract>IFormData]<:--[QuestionnaireFormData] - [<abstract>WithQuestionnaireControls | +questionsArray: FormArray<dynamic>; @@ -283,21 +271,33 @@ [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] + [QuestionnaireFormData + | + +questionsData: List<QuestionFormData>?; + +id: String + | + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() + ] + + [<abstract>IFormData]<:--[QuestionnaireFormData] + - + - + - + - + - + - + @@ -307,35 +307,37 @@ - + - + - - - + + + - + - - - + + - + + - + - + + + - + - - - - + + + + + - - + @@ -343,77 +345,75 @@ - - - - + + + + - - - + + + - - - - - - - - + - - + - + - - - + - + - - - + - + + + - + - - + + - + - + - + + + + + + + + + - + - + - + - + - - - + + + - + WithScheduleControls - + +isTimeRestrictedControl: FormControl<bool> +instanceID: FormControl<String> @@ -432,7 +432,7 @@ - + +void setScheduleControlsFrom() -dynamic _initReminderControl() @@ -442,9 +442,9 @@ - + - + FormControl @@ -453,9 +453,9 @@ - + - + StreamSubscription @@ -516,23 +516,23 @@ - - - + + + - + ScheduleControls - + +formViewModel: WithScheduleControls - + +Widget build() -List<FormTableRow> _conditionalTimeRestrictions() @@ -542,28 +542,86 @@ - + - + FormConsumerWidget + + + + + + + + SurveyQuestionType + + + + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType + + + + + + + + + + + Enum + + + + + + + + + + + + + ChoiceQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() + + + + - - - + + + - + QuestionFormViewModel - + <static>+defaultQuestionType: SurveyQuestionType -_titles: Map<FormMode, String Function()>? @@ -618,7 +676,7 @@ - + +String? scaleMidLabelAt() -dynamic _onScaleRangeChanged() @@ -639,68 +697,74 @@ - - - - + + + - - - SurveyQuestionType + + + ConsumerWidget - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType + + + + + + + + + + BoolQuestionFormView - - - - + + + +formViewModel: QuestionFormViewModel + + - - - FormArray + + + +Widget build() - - - + + + + - - - FormGroup + + + IScaleQuestionFormViewModel - - - - - - - - ManagedFormViewModel + + + +isMidValuesClearedInfoVisible: bool - - - + + + + - - - IListActionProvider + + + ScaleQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel @@ -848,126 +912,62 @@ - - - - - - - - IScaleQuestionFormViewModel - - - - - - +isMidValuesClearedInfoVisible: bool - - - - - - - - - - - - ScaleQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - - + + + - - - Enum + + + FormArray - - - - - - - - - BoolQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - + + + - - - +Widget build() + + + FormGroup - - - + + + - - - ConsumerWidget + + + ManagedFormViewModel - - - - - - - - - ChoiceQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - + + + - - - +Widget build() + + + IListActionProvider - - + + - + SurveyQuestionFormView - + +formViewModel: QuestionFormViewModel +isHtmlStyleable: bool @@ -975,47 +975,19 @@ - - - - - - - - - QuestionnaireFormData - - - - - - +questionsData: List<QuestionFormData>? - +id: String - - - - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() - - - - - - - + + + - + WithQuestionnaireControls - + +questionsArray: FormArray<dynamic> +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> @@ -1026,7 +998,7 @@ - + +void setQuestionnaireControlsFrom() +QuestionnaireFormData buildQuestionnaireFormData() @@ -1041,9 +1013,9 @@ - + - + FormViewModelCollection @@ -1052,9 +1024,9 @@ - + - + IFormViewModelDelegate @@ -1063,15 +1035,43 @@ - + - + IProviderArgsResolver + + + + + + + + + QuestionnaireFormData + + + + + + +questionsData: List<QuestionFormData>? + +id: String + + + + + + +StudyUQuestionnaire toQuestionnaire() + +List<EligibilityCriterion> toEligibilityCriteria() + +QuestionnaireFormData copy() + + + + diff --git a/docs/uml/designer_v2/lib/features/design/uml.svg b/docs/uml/designer_v2/lib/features/design/uml.svg index c6a94b685..91b4cb16e 100644 --- a/docs/uml/designer_v2/lib/features/design/uml.svg +++ b/docs/uml/designer_v2/lib/features/design/uml.svg @@ -1,696 +1,679 @@ - - [StudyFormViewModel + + [StudyDesignInfoFormView | - +studyDirtyCopy: Study?; - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +router: GoRouter; - +studyInfoFormViewModel: StudyInfoFormViewModel; - +enrollmentFormViewModel: EnrollmentFormViewModel; - +measurementsFormViewModel: MeasurementsFormViewModel; - +reportsFormViewModel: ReportsFormViewModel; - +interventionsFormViewModel: InterventionsFormViewModel; - +form: FormGroup; - +isStudyReadonly: bool; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String> - | - +void read(); - +void setControlsFrom(); - +Study buildFormData(); - +void dispose(); - +void onCancel(); - +dynamic onSave(); - -dynamic _applyAndSaveSubform() + +Widget build() ] - [StudyFormViewModel]o-[Study] - [StudyFormViewModel]o-[<abstract>IStudyRepository] - [StudyFormViewModel]o-[<abstract>IAuthRepository] - [StudyFormViewModel]o-[GoRouter] - [StudyFormViewModel]o-[StudyInfoFormViewModel] - [StudyFormViewModel]o-[EnrollmentFormViewModel] - [StudyFormViewModel]o-[MeasurementsFormViewModel] - [StudyFormViewModel]o-[ReportsFormViewModel] - [StudyFormViewModel]o-[InterventionsFormViewModel] - [StudyFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] - [ConsentItemFormView + [StudyInfoFormViewModel | - +formViewModel: ConsentItemFormViewModel + +study: Study; + +titleControl: FormControl<String>; + +iconControl: FormControl<IconOption>; + +descriptionControl: FormControl<String>; + +organizationControl: FormControl<String>; + +reviewBoardControl: FormControl<String>; + +reviewBoardNumberControl: FormControl<String>; + +researchersControl: FormControl<String>; + +emailControl: FormControl<String>; + +websiteControl: FormControl<String>; + +phoneControl: FormControl<String>; + +additionalInfoControl: FormControl<String>; + +form: FormGroup; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +iconRequired: dynamic; + +organizationRequired: dynamic; + +reviewBoardRequired: dynamic; + +reviewBoardNumberRequired: dynamic; + +researchersRequired: dynamic; + +emailRequired: dynamic; + +phoneRequired: dynamic; + +emailFormat: dynamic; + +websiteFormat: dynamic + | + +void setControlsFrom(); + +StudyInfoFormData buildFormData() ] - [ConsentItemFormView]o-[ConsentItemFormViewModel] + [StudyInfoFormViewModel]o-[Study] + [StudyInfoFormViewModel]o-[FormControl] + [StudyInfoFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] - [EnrollmentFormData + [StudyInfoFormData | - <static>+kDefaultEnrollmentType: Participation; - +enrollmentType: Participation; - +questionnaireFormData: QuestionnaireFormData; - +consentItemsFormData: List<ConsentItemFormData>?; + +title: String; + +description: String?; + +iconName: String; + +contactInfoFormData: StudyContactInfoFormData; +id: String | +Study apply(); - +EnrollmentFormData copy() + +StudyInfoFormData copy() ] - [EnrollmentFormData]o-[Participation] - [EnrollmentFormData]o-[QuestionnaireFormData] - [<abstract>IStudyFormData]<:--[EnrollmentFormData] + [StudyInfoFormData]o-[StudyContactInfoFormData] + [<abstract>IStudyFormData]<:--[StudyInfoFormData] - [StudyDesignEnrollmentFormView + [StudyContactInfoFormData | - +Widget build(); - -dynamic _showScreenerQuestionSidesheetWithArgs(); - -dynamic _showConsentItemSidesheetWithArgs() + +organization: String?; + +institutionalReviewBoard: String?; + +institutionalReviewBoardNumber: String?; + +researchers: String?; + +email: String?; + +website: String?; + +phone: String?; + +additionalInfo: String?; + +id: String + | + +Study apply(); + +StudyInfoFormData copy() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] + [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - [ConsentItemFormViewModel + [StudyFormScaffold | - +consentIdControl: FormControl<String>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +form: FormGroup; - +consentId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +titles: Map<FormMode, String> + +studyId: String; + +formViewModelBuilder: T Function(WidgetRef); + +formViewBuilder: Widget Function(T) | - +void setControlsFrom(); - +ConsentItemFormData buildFormData(); - +ConsentItemFormViewModel createDuplicate() + +Widget build() ] - [ConsentItemFormViewModel]o-[FormControl] - [ConsentItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] - - [<abstract>IScreenerQuestionLogicFormViewModel - | - +isDirtyOptionsBannerVisible: bool - ] + [StudyFormScaffold]o-[T Function(WidgetRef)] + [StudyFormScaffold]o-[Widget Function(T)] + [<abstract>ConsumerWidget]<:-[StudyFormScaffold] - [ScreenerQuestionLogicFormView - | - +formViewModel: ScreenerQuestionFormViewModel + [StudyFormValidationSet | - +Widget build(); - -dynamic _buildInfoBanner(); - -dynamic _buildAnswerOptionsLogicControls(); - -List<Widget> _buildOptionLogicRow() + +index: int; + <static>+values: List<StudyFormValidationSet> ] - [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] - [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] + [Enum]<:--[StudyFormValidationSet] - [ScreenerQuestionFormViewModel - | - <static>+defaultResponseOptionValidity: bool; - +responseOptionsDisabledArray: FormArray<dynamic>; - +responseOptionsLogicControls: FormArray<bool>; - +responseOptionsLogicDescriptionControls: FormArray<String>; - -_questionBaseControls: Map<String, AbstractControl<dynamic>>; - +prevResponseOptionControls: List<AbstractControl<dynamic>>; - +prevResponseOptionValues: List<dynamic>; - +responseOptionsDisabledControls: List<AbstractControl<dynamic>>; - +logicControlOptions: List<FormControlOption<bool>>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isDirtyOptionsBannerVisible: bool + [StudyDesignMeasurementsFormView | - +dynamic onResponseOptionsChanged(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - -List<FormControl<dynamic>> _copyFormControls(); - -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); - -AbstractControl<dynamic>? _findAssociatedControlFor(); - +ScreenerQuestionFormViewModel createDuplicate() + +Widget build() ] - [ScreenerQuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] - [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] - [EnrollmentFormViewModel + [MeasurementsFormViewModel | +study: Study; +router: GoRouter; - +consentItemDelegate: EnrollmentFormConsentItemDelegate; - +enrollmentTypeControl: FormControl<Participation>; - +consentItemArray: FormArray<dynamic>; - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +measurementsArray: FormArray<dynamic>; + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; +form: FormGroup; - +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; - +consentItemModels: List<ConsentItemFormViewModel>; + +measurementViewModels: List<MeasurementSurveyFormViewModel>; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestScreener: bool; - +canTestConsent: bool; - +questionTitles: Map<FormMode, String Function()> + +measurementRequired: dynamic; + +titles: Map<FormMode, String> | - +void setControlsFrom(); - +EnrollmentFormData buildFormData(); +void read(); + +void setControlsFrom(); + +MeasurementsFormData buildFormData(); +List<ModelAction<dynamic>> availableActions(); +List<ModelAction<dynamic>> availablePopupActions(); +List<ModelAction<dynamic>> availableInlineActions(); +void onSelectItem(); +void onNewItem(); - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); - +dynamic testScreener(); - +dynamic testConsent(); - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + +MeasurementSurveyFormViewModel provide(); + +void onCancel(); + +dynamic onSave() ] - [EnrollmentFormViewModel]o-[Study] - [EnrollmentFormViewModel]o-[GoRouter] - [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] - [EnrollmentFormViewModel]o-[FormControl] - [EnrollmentFormViewModel]o-[FormArray] - [EnrollmentFormViewModel]o-[FormViewModelCollection] - [EnrollmentFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] - [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] + [MeasurementsFormViewModel]o-[Study] + [MeasurementsFormViewModel]o-[GoRouter] + [MeasurementsFormViewModel]o-[FormArray] + [MeasurementsFormViewModel]o-[FormViewModelCollection] + [MeasurementsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] + [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] - [EnrollmentFormConsentItemDelegate + [MeasurementsFormData | - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +owner: EnrollmentFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic + +surveyMeasurements: List<MeasurementSurveyFormData>; + +id: String | - +void onCancel(); - +dynamic onSave(); - +ConsentItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + +Study apply(); + +MeasurementsFormData copy() ] - [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] - [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IStudyFormData]<:--[MeasurementsFormData] - [ConsentItemFormData + [MeasurementSurveyFormViewModel | - +consentId: String; - +title: String; - +description: String; - +iconName: String?; - +id: String - | - +ConsentItem toConsentItem(); - +ConsentItemFormData copy() - ] - - [<abstract>IFormData]<:-[ConsentItemFormData] - - [InterventionsFormData - | - +interventionsData: List<InterventionFormData>; - +studyScheduleData: StudyScheduleFormData; - +id: String - | - +Study apply(); - +InterventionsFormData copy() - ] - - [InterventionsFormData]o-[StudyScheduleFormData] - [<abstract>IStudyFormData]<:--[InterventionsFormData] - - [InterventionTaskFormViewModel - | - +taskIdControl: FormControl<String>; + +study: Study; + +measurementIdControl: FormControl<String>; +instanceIdControl: FormControl<String>; - +taskTitleControl: FormControl<String>; - +taskDescriptionControl: FormControl<String>; - +markAsCompletedControl: FormControl<bool>; + +surveyTitleControl: FormControl<String>; + +surveyIntroTextControl: FormControl<String>; + +surveyOutroTextControl: FormControl<String>; +form: FormGroup; - +taskId: String; + +measurementId: String; +instanceId: String; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; +titleRequired: dynamic; + +atLeastOneQuestion: dynamic; + +breadcrumbsTitle: String; +titles: Map<FormMode, String> | +void setControlsFrom(); - +InterventionTaskFormData buildFormData(); - +InterventionTaskFormViewModel createDuplicate() + +MeasurementSurveyFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); + +SurveyQuestionFormRouteArgs buildFormRouteArgs(); + +MeasurementSurveyFormViewModel createDuplicate() ] - [InterventionTaskFormViewModel]o-[FormControl] - [InterventionTaskFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] - [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] + [MeasurementSurveyFormViewModel]o-[Study] + [MeasurementSurveyFormViewModel]o-[FormControl] + [MeasurementSurveyFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] + [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] + [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] - [InterventionTaskFormView + [MeasurementSurveyFormData | - +formViewModel: InterventionTaskFormViewModel + +measurementId: String; + +title: String; + +introText: String?; + +outroText: String?; + +questionnaireFormData: QuestionnaireFormData; + <static>+kDefaultTitle: String; + +id: String + | + +QuestionnaireTask toQuestionnaireTask(); + +MeasurementSurveyFormData copy() ] - [InterventionTaskFormView]o-[InterventionTaskFormViewModel] + [MeasurementSurveyFormData]o-[QuestionnaireFormData] + [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] - [StudyScheduleFormData + [SurveyPreview | - +sequenceType: PhaseSequence; - +sequenceTypeCustom: String; - +numCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +id: String + +routeArgs: MeasurementFormRouteArgs | - +StudySchedule toStudySchedule(); - +Study apply(); - +StudyScheduleFormData copy() + +Widget build() ] - [StudyScheduleFormData]o-[PhaseSequence] - [<abstract>IStudyFormData]<:--[StudyScheduleFormData] + [SurveyPreview]o-[MeasurementFormRouteArgs] + [<abstract>ConsumerWidget]<:-[SurveyPreview] - [InterventionFormView + [MeasurementSurveyFormView | - +formViewModel: InterventionFormViewModel + +formViewModel: MeasurementSurveyFormViewModel ] - [InterventionFormView]o-[InterventionFormViewModel] + [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] - [InterventionsFormViewModel + [<abstract>IStudyFormData + | + +Study apply() + ] + + [<abstract>IFormData]<:--[<abstract>IStudyFormData] + + [ReportsFormViewModel | +study: Study; +router: GoRouter; - +interventionsArray: FormArray<dynamic>; - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; + +reportItemDelegate: ReportFormItemDelegate; + +reportItemArray: FormArray<dynamic>; + +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; +form: FormGroup; + +reportItemModels: List<ReportItemFormViewModel>; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +interventionsRequired: dynamic; +titles: Map<FormMode, String>; - +canTestStudySchedule: bool + +canTestConsent: bool | +void setControlsFrom(); - +InterventionsFormData buildFormData(); + +ReportsFormData buildFormData(); +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +InterventionFormViewModel provide(); + +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); + +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); + +dynamic testReport(); +void onCancel(); +dynamic onSave(); - +dynamic testStudySchedule() + +ReportItemFormViewModel provide() ] - [InterventionsFormViewModel]o-[Study] - [InterventionsFormViewModel]o-[GoRouter] - [InterventionsFormViewModel]o-[FormArray] - [InterventionsFormViewModel]o-[FormViewModelCollection] - [InterventionsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InterventionsFormViewModel] - [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] + [ReportsFormViewModel]o-[Study] + [ReportsFormViewModel]o-[GoRouter] + [ReportsFormViewModel]o-[ReportFormItemDelegate] + [ReportsFormViewModel]o-[FormArray] + [ReportsFormViewModel]o-[FormViewModelCollection] + [ReportsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[ReportsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[ReportsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[ReportsFormViewModel] - [InterventionFormData + [ReportFormItemDelegate | - +interventionId: String; - +title: String; - +description: String?; - +tasksData: List<InterventionTaskFormData>?; - +iconName: String?; - <static>+kDefaultTitle: String; - +id: String + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; + +owner: ReportsFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic | - +Intervention toIntervention(); - +InterventionFormData copy() + +void onCancel(); + +dynamic onSave(); + +ReportItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() ] - [<abstract>IFormData]<:-[InterventionFormData] + [ReportFormItemDelegate]o-[FormViewModelCollection] + [ReportFormItemDelegate]o-[ReportsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] + [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] + [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] - [StudyScheduleFormView + [ReportItemFormView | - +formViewModel: StudyScheduleControls + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: dynamic; + +sectionTypeBodyBuilder: Widget Function(BuildContext) + | + +Widget build(); + -dynamic _buildSectionText(); + -dynamic _buildSectionTypeHeader() + ] + + [ReportItemFormView]o-[ReportItemFormViewModel] + [ReportItemFormView]o-[Widget Function(BuildContext)] + + [LinearRegressionSectionFormView + | + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | - -FormTableRow _renderCustomSequence(); +Widget build() ] - [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] - [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] + [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - [InterventionFormViewModel + [DataReferenceIdentifier | - +study: Study; - +interventionIdControl: FormControl<String>; - +interventionTitleControl: FormControl<String>; - +interventionIconControl: FormControl<IconOption>; - +interventionDescriptionControl: FormControl<String>; - +interventionTasksArray: FormArray<dynamic>; - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; - +form: FormGroup; - +interventionId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneTask: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> + +hashCode: int | - +void setControlsFrom(); - +InterventionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +void onCancel(); - +dynamic onSave(); - +InterventionTaskFormViewModel provide(); - +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); - +InterventionTaskFormRouteArgs buildFormRouteArgs(); - +InterventionFormViewModel createDuplicate() + +bool ==() ] - [InterventionFormViewModel]o-[Study] - [InterventionFormViewModel]o-[FormControl] - [InterventionFormViewModel]o-[FormArray] - [InterventionFormViewModel]o-[FormViewModelCollection] - [InterventionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] + [DataReference]<:-[DataReferenceIdentifier] - [<abstract>StudyScheduleControls + [DataReferenceEditor | - <static>+defaultScheduleType: PhaseSequence; - <static>+defaultScheduleTypeSequence: String; - <static>+defaultNumCycles: int; - <static>+defaultPeriodLength: int; - +sequenceTypeControl: FormControl<PhaseSequence>; - +sequenceTypeCustomControl: FormControl<String>; - +phaseDurationControl: FormControl<int>; - +numCyclesControl: FormControl<int>; - +includeBaselineControl: FormControl<bool>; - +studyScheduleControls: Map<String, FormControl<Object>>; - <static>+kNumCyclesMin: int; - <static>+kNumCyclesMax: int; - <static>+kPhaseDurationMin: int; - <static>+kPhaseDurationMax: int; - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +numCyclesRange: dynamic; - +phaseDurationRange: dynamic; - +customSequenceRequired: dynamic + +formControl: FormControl<DataReferenceIdentifier<T>>; + +availableTasks: List<Task>; + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + | + +FormTableRow buildFormTableRow(); + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + ] + + [DataReferenceEditor]o-[FormControl] + [DataReferenceEditor]o-[ReactiveDropdownField] + + [TemporalAggregationFormatted + | + -_value: TemporalAggregation; + <static>+values: List<TemporalAggregationFormatted>; + +value: TemporalAggregation; + +string: String; + +icon: IconData?; + +hashCode: int + | + +bool ==(); + +String toString(); + +String toJson(); + <static>+TemporalAggregationFormatted fromJson() + ] + + [TemporalAggregationFormatted]o-[TemporalAggregation] + [TemporalAggregationFormatted]o-[IconData] + + [ImprovementDirectionFormatted + | + -_value: ImprovementDirection; + <static>+values: List<ImprovementDirectionFormatted>; + +value: ImprovementDirection; + +string: String; + +icon: IconData?; + +hashCode: int + | + +bool ==(); + +String toString(); + +String toJson(); + <static>+ImprovementDirectionFormatted fromJson() + ] + + [ImprovementDirectionFormatted]o-[ImprovementDirection] + [ImprovementDirectionFormatted]o-[IconData] + + [ReportSectionType + | + +index: int; + <static>+values: List<ReportSectionType>; + <static>+average: ReportSectionType; + <static>+linearRegression: ReportSectionType + ] + + [ReportSectionType]o-[ReportSectionType] + [Enum]<:--[ReportSectionType] + + [AverageSectionFormView + | + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> + | + +Widget build() + ] + + [AverageSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[AverageSectionFormView] + + [ReportItemFormViewModel + | + <static>+defaultSectionType: ReportSectionType; + +sectionIdControl: FormControl<String>; + +sectionTypeControl: FormControl<ReportSectionType>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +sectionControl: FormControl<ReportSection>; + +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; + +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; + +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; + +alphaControl: FormControl<double>; + -_controlsBySectionType: Map<ReportSectionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +sectionBaseControls: Map<String, AbstractControl<dynamic>>; + +form: FormGroup; + +sectionId: String; + +sectionType: ReportSectionType; + <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; + <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; + <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +dataReferenceRequired: dynamic; + +aggregationRequired: dynamic; + +improvementDirectionRequired: dynamic; + +alphaConfidenceRequired: dynamic | - +void setStudyScheduleControlsFrom(); - +StudyScheduleFormData buildStudyScheduleFormData(); - +bool isSequencingCustom() + -List<FormControlValidation> _getValidationConfig(); + +ReportItemFormData buildFormData(); + +ReportItemFormViewModel createDuplicate(); + +dynamic onSectionTypeChanged(); + -void _updateFormControls(); + +void setControlsFrom() ] - [<abstract>StudyScheduleControls]o-[PhaseSequence] - [<abstract>StudyScheduleControls]o-[FormControl] + [ReportItemFormViewModel]o-[ReportSectionType] + [ReportItemFormViewModel]o-[FormControl] + [ReportItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] - [StudyDesignInterventionsFormView + [ReportItemFormData | - +Widget build() + +isPrimary: bool; + +section: ReportSection; + +id: String + | + <static>+dynamic fromDomainModel(); + +ReportItemFormData copy() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] + [ReportItemFormData]o-[<abstract>ReportSection] + [<abstract>IFormData]<:-[ReportItemFormData] - [InterventionTaskFormData + [ReportsFormData | - +taskId: String; - +taskTitle: String; - +taskDescription: String?; - <static>+kDefaultTitle: String; + +reportItems: List<ReportItemFormData>; +id: String | - +CheckmarkTask toTask(); - +InterventionTaskFormData copy() + +Study apply(); + +ReportsFormData copy() ] - [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] + [<abstract>IStudyFormData]<:--[ReportsFormData] - [InterventionPreview + [ReportStatus | - +routeArgs: InterventionFormRouteArgs + +index: int; + <static>+values: List<ReportStatus>; + <static>+primary: ReportStatus; + <static>+secondary: ReportStatus + ] + + [ReportStatus]o-[ReportStatus] + [Enum]<:--[ReportStatus] + + [StudyDesignReportsFormView + | + +Widget build(); + -dynamic _showReportItemSidesheetWithArgs() + ] + + [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] + + [ReportBadge + | + +status: ReportStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool | +Widget build() ] - [InterventionPreview]o-[InterventionFormRouteArgs] - [<abstract>ConsumerWidget]<:-[InterventionPreview] + [ReportBadge]o-[ReportStatus] + [ReportBadge]o-[BadgeType] - [StudyFormValidationSet + [StudyDesignEnrollmentFormView | - +index: int; - <static>+values: List<StudyFormValidationSet> + +Widget build(); + -dynamic _showScreenerQuestionSidesheetWithArgs(); + -dynamic _showConsentItemSidesheetWithArgs() ] - [Enum]<:--[StudyFormValidationSet] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] - [StudyInfoFormData + [ConsentItemFormData | + +consentId: String; +title: String; - +description: String?; - +iconName: String; - +contactInfoFormData: StudyContactInfoFormData; + +description: String; + +iconName: String?; +id: String | - +Study apply(); - +StudyInfoFormData copy() + +ConsentItem toConsentItem(); + +ConsentItemFormData copy() ] - [StudyInfoFormData]o-[StudyContactInfoFormData] - [<abstract>IStudyFormData]<:--[StudyInfoFormData] + [<abstract>IFormData]<:-[ConsentItemFormData] - [StudyContactInfoFormData + [EnrollmentFormData | - +organization: String?; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String?; - +website: String?; - +phone: String?; - +additionalInfo: String?; + <static>+kDefaultEnrollmentType: Participation; + +enrollmentType: Participation; + +questionnaireFormData: QuestionnaireFormData; + +consentItemsFormData: List<ConsentItemFormData>?; +id: String | +Study apply(); - +StudyInfoFormData copy() - ] - - [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - - [StudyDesignInfoFormView - | - +Widget build() + +EnrollmentFormData copy() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] + [EnrollmentFormData]o-[Participation] + [EnrollmentFormData]o-[QuestionnaireFormData] + [<abstract>IStudyFormData]<:--[EnrollmentFormData] - [StudyInfoFormViewModel + [ConsentItemFormViewModel | - +study: Study; + +consentIdControl: FormControl<String>; +titleControl: FormControl<String>; - +iconControl: FormControl<IconOption>; +descriptionControl: FormControl<String>; - +organizationControl: FormControl<String>; - +reviewBoardControl: FormControl<String>; - +reviewBoardNumberControl: FormControl<String>; - +researchersControl: FormControl<String>; - +emailControl: FormControl<String>; - +websiteControl: FormControl<String>; - +phoneControl: FormControl<String>; - +additionalInfoControl: FormControl<String>; + +iconControl: FormControl<IconOption>; +form: FormGroup; - +titles: Map<FormMode, String>; + +consentId: String; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; +titleRequired: dynamic; +descriptionRequired: dynamic; - +iconRequired: dynamic; - +organizationRequired: dynamic; - +reviewBoardRequired: dynamic; - +reviewBoardNumberRequired: dynamic; - +researchersRequired: dynamic; - +emailRequired: dynamic; - +phoneRequired: dynamic; - +emailFormat: dynamic; - +websiteFormat: dynamic - | - +void setControlsFrom(); - +StudyInfoFormData buildFormData() - ] - - [StudyInfoFormViewModel]o-[Study] - [StudyInfoFormViewModel]o-[FormControl] - [StudyInfoFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] - - [MeasurementsFormViewModel - | - +study: Study; - +router: GoRouter; - +measurementsArray: FormArray<dynamic>; - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; - +form: FormGroup; - +measurementViewModels: List<MeasurementSurveyFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +measurementRequired: dynamic; +titles: Map<FormMode, String> | - +void read(); +void setControlsFrom(); - +MeasurementsFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +MeasurementSurveyFormViewModel provide(); - +void onCancel(); - +dynamic onSave() + +ConsentItemFormData buildFormData(); + +ConsentItemFormViewModel createDuplicate() ] - [MeasurementsFormViewModel]o-[Study] - [MeasurementsFormViewModel]o-[GoRouter] - [MeasurementsFormViewModel]o-[FormArray] - [MeasurementsFormViewModel]o-[FormViewModelCollection] - [MeasurementsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] + [ConsentItemFormViewModel]o-[FormControl] + [ConsentItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] - [StudyDesignMeasurementsFormView + [<abstract>IScreenerQuestionLogicFormViewModel | - +Widget build() + +isDirtyOptionsBannerVisible: bool ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] - - [SurveyPreview + [ScreenerQuestionLogicFormView | - +routeArgs: MeasurementFormRouteArgs + +formViewModel: ScreenerQuestionFormViewModel | - +Widget build() + +Widget build(); + -dynamic _buildInfoBanner(); + -dynamic _buildAnswerOptionsLogicControls(); + -List<Widget> _buildOptionLogicRow() ] - [SurveyPreview]o-[MeasurementFormRouteArgs] - [<abstract>ConsumerWidget]<:-[SurveyPreview] + [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] + [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] - [MeasurementSurveyFormView + [ScreenerQuestionFormViewModel | - +formViewModel: MeasurementSurveyFormViewModel + <static>+defaultResponseOptionValidity: bool; + +responseOptionsDisabledArray: FormArray<dynamic>; + +responseOptionsLogicControls: FormArray<bool>; + +responseOptionsLogicDescriptionControls: FormArray<String>; + -_questionBaseControls: Map<String, AbstractControl<dynamic>>; + +prevResponseOptionControls: List<AbstractControl<dynamic>>; + +prevResponseOptionValues: List<dynamic>; + +responseOptionsDisabledControls: List<AbstractControl<dynamic>>; + +logicControlOptions: List<FormControlOption<bool>>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isDirtyOptionsBannerVisible: bool + | + +dynamic onResponseOptionsChanged(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + -List<FormControl<dynamic>> _copyFormControls(); + -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); + -AbstractControl<dynamic>? _findAssociatedControlFor(); + +ScreenerQuestionFormViewModel createDuplicate() ] - [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] + [ScreenerQuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] + [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] - [MeasurementSurveyFormViewModel + [EnrollmentFormViewModel | +study: Study; - +measurementIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +surveyTitleControl: FormControl<String>; - +surveyIntroTextControl: FormControl<String>; - +surveyOutroTextControl: FormControl<String>; + +router: GoRouter; + +consentItemDelegate: EnrollmentFormConsentItemDelegate; + +enrollmentTypeControl: FormControl<Participation>; + +consentItemArray: FormArray<dynamic>; + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; +form: FormGroup; - +measurementId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneQuestion: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> + +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; + +consentItemModels: List<ConsentItemFormViewModel>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titles: Map<FormMode, String>; + +canTestScreener: bool; + +canTestConsent: bool; + +questionTitles: Map<FormMode, String Function()> | +void setControlsFrom(); - +MeasurementSurveyFormData buildFormData(); + +EnrollmentFormData buildFormData(); + +void read(); +List<ModelAction<dynamic>> availableActions(); +List<ModelAction<dynamic>> availablePopupActions(); +List<ModelAction<dynamic>> availableInlineActions(); +void onSelectItem(); +void onNewItem(); - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); - +SurveyQuestionFormRouteArgs buildFormRouteArgs(); - +MeasurementSurveyFormViewModel createDuplicate() - ] - - [MeasurementSurveyFormViewModel]o-[Study] - [MeasurementSurveyFormViewModel]o-[FormControl] - [MeasurementSurveyFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] - - [MeasurementSurveyFormData - | - +measurementId: String; - +title: String; - +introText: String?; - +outroText: String?; - +questionnaireFormData: QuestionnaireFormData; - <static>+kDefaultTitle: String; - +id: String - | - +QuestionnaireTask toQuestionnaireTask(); - +MeasurementSurveyFormData copy() - ] - - [MeasurementSurveyFormData]o-[QuestionnaireFormData] - [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] - - [MeasurementsFormData - | - +surveyMeasurements: List<MeasurementSurveyFormData>; - +id: String - | - +Study apply(); - +MeasurementsFormData copy() + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); + +dynamic testScreener(); + +dynamic testConsent(); + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() ] - [<abstract>IStudyFormData]<:--[MeasurementsFormData] + [EnrollmentFormViewModel]o-[Study] + [EnrollmentFormViewModel]o-[GoRouter] + [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] + [EnrollmentFormViewModel]o-[FormControl] + [EnrollmentFormViewModel]o-[FormArray] + [EnrollmentFormViewModel]o-[FormViewModelCollection] + [EnrollmentFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] + [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] + [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] - [<abstract>IStudyFormData + [EnrollmentFormConsentItemDelegate | - +Study apply() - ] - - [<abstract>IFormData]<:--[<abstract>IStudyFormData] - - [<abstract>StudyDesignPageWidget + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +owner: EnrollmentFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic | - +Widget? banner() + +void onCancel(); + +dynamic onSave(); + +ConsentItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() ] - [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] + [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] + [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] - [StudyFormScaffold - | - +studyId: String; - +formViewModelBuilder: T Function(WidgetRef); - +formViewBuilder: Widget Function(T) + [ConsentItemFormView | - +Widget build() + +formViewModel: ConsentItemFormViewModel ] - [StudyFormScaffold]o-[T Function(WidgetRef)] - [StudyFormScaffold]o-[Widget Function(T)] - [<abstract>ConsumerWidget]<:-[StudyFormScaffold] + [ConsentItemFormView]o-[ConsentItemFormViewModel] [<abstract>WithScheduleControls | @@ -742,82 +725,49 @@ [ScheduleControls]o-[<abstract>WithScheduleControls] [<abstract>FormConsumerWidget]<:-[ScheduleControls] - [QuestionFormViewModel + [SurveyQuestionType + | + +index: int; + <static>+values: List<SurveyQuestionType>; + <static>+choice: SurveyQuestionType; + <static>+bool: SurveyQuestionType; + <static>+scale: SurveyQuestionType + ] + + [SurveyQuestionType]o-[SurveyQuestionType] + [Enum]<:--[SurveyQuestionType] + + [ChoiceQuestionFormView + | + +formViewModel: QuestionFormViewModel + | + +Widget build() + ] + + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + + [BoolQuestionFormView + | + +formViewModel: QuestionFormViewModel + | + +Widget build() + ] + + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] + + [<abstract>IScaleQuestionFormViewModel | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +form: FormGroup; - +questionId: String; - +questionType: SurveyQuestionType; - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; - +answerOptionsArray: FormArray<dynamic>; - +answerOptionsControls: List<AbstractControl<dynamic>>; - +validAnswerOptions: List<String>; - +boolOptions: List<AbstractControl<String>>; - +scaleMinValue: int; - +scaleMaxValue: int; - +scaleRange: int; - +scaleAllValueControls: List<AbstractControl<int>>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +questionTextRequired: dynamic; - +numValidChoiceOptions: dynamic; - +scaleRangeValid: dynamic; - +titles: Map<FormMode, String>; - +isAddOptionButtonVisible: bool; +isMidValuesClearedInfoVisible: bool + ] + + [ScaleQuestionFormView | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); - +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem(); - +QuestionFormViewModel createDuplicate() + +formViewModel: QuestionFormViewModel ] - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + [ScaleQuestionFormView]o-[QuestionFormViewModel] [<abstract>QuestionFormData | @@ -889,49 +839,82 @@ [ScaleQuestionFormData]o-[Color] [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] - [<abstract>IScaleQuestionFormViewModel + [QuestionFormViewModel | + <static>+defaultQuestionType: SurveyQuestionType; + -_titles: Map<FormMode, String Function()>?; + +questionIdControl: FormControl<String>; + +questionTypeControl: FormControl<SurveyQuestionType>; + +questionTextControl: FormControl<String>; + +questionInfoTextControl: FormControl<String>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isMultipleChoiceControl: FormControl<bool>; + +choiceResponseOptionsArray: FormArray<dynamic>; + +customOptionsMin: int; + +customOptionsMax: int; + +customOptionsInitial: int; + +boolResponseOptionsArray: FormArray<String>; + <static>+kDefaultScaleMinValue: int; + <static>+kDefaultScaleMaxValue: int; + <static>+kNumMidValueControls: int; + <static>+kMidValueDebounceMilliseconds: int; + +scaleMinValueControl: FormControl<int>; + +scaleMaxValueControl: FormControl<int>; + -_scaleRangeControl: FormControl<int>; + +scaleMinLabelControl: FormControl<String>; + +scaleMaxLabelControl: FormControl<String>; + +scaleMidValueControls: FormArray<int>; + +scaleMidLabelControls: FormArray<String?>; + -_scaleResponseOptionsArray: FormArray<int>; + +scaleMinColorControl: FormControl<SerializableColor>; + +scaleMaxColorControl: FormControl<SerializableColor>; + +prevMidValues: List<int?>?; + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +form: FormGroup; + +questionId: String; + +questionType: SurveyQuestionType; + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; + +answerOptionsArray: FormArray<dynamic>; + +answerOptionsControls: List<AbstractControl<dynamic>>; + +validAnswerOptions: List<String>; + +boolOptions: List<AbstractControl<String>>; + +scaleMinValue: int; + +scaleMaxValue: int; + +scaleRange: int; + +scaleAllValueControls: List<AbstractControl<int>>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +questionTextRequired: dynamic; + +numValidChoiceOptions: dynamic; + +scaleRangeValid: dynamic; + +titles: Map<FormMode, String>; + +isAddOptionButtonVisible: bool; +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView - | - +formViewModel: QuestionFormViewModel - ] - - [ScaleQuestionFormView]o-[QuestionFormViewModel] - - [SurveyQuestionType - | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType - ] - - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] - - [BoolQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - - [ChoiceQuestionFormView - | - +formViewModel: QuestionFormViewModel | - +Widget build() + +String? scaleMidLabelAt(); + -dynamic _onScaleRangeChanged(); + -dynamic _applyInputFormatters(); + -dynamic _updateScaleMidValueControls(); + -List<FormControlValidation> _getValidationConfig(); + +dynamic onQuestionTypeChanged(); + +dynamic onResponseOptionsChanged(); + -void _updateFormControls(); + +void initControls(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem(); + +QuestionFormViewModel createDuplicate() ] - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] [SurveyQuestionFormView | @@ -941,18 +924,6 @@ [SurveyQuestionFormView]o-[QuestionFormViewModel] - [QuestionnaireFormData - | - +questionsData: List<QuestionFormData>?; - +id: String - | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() - ] - - [<abstract>IFormData]<:--[QuestionnaireFormData] - [<abstract>WithQuestionnaireControls | +questionsArray: FormArray<dynamic>; @@ -976,1162 +947,1322 @@ [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - [StudyDesignReportsFormView + [QuestionnaireFormData | - +Widget build(); - -dynamic _showReportItemSidesheetWithArgs() + +questionsData: List<QuestionFormData>?; + +id: String + | + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] + [<abstract>IFormData]<:--[QuestionnaireFormData] - [ReportsFormViewModel + [<abstract>StudyDesignPageWidget | - +study: Study; + +Widget? banner() + ] + + [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] + + [StudyFormViewModel + | + +studyDirtyCopy: Study?; + +studyRepository: IStudyRepository; + +authRepository: IAuthRepository; +router: GoRouter; - +reportItemDelegate: ReportFormItemDelegate; - +reportItemArray: FormArray<dynamic>; - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; + +studyInfoFormViewModel: StudyInfoFormViewModel; + +enrollmentFormViewModel: EnrollmentFormViewModel; + +measurementsFormViewModel: MeasurementsFormViewModel; + +reportsFormViewModel: ReportsFormViewModel; + +interventionsFormViewModel: InterventionsFormViewModel; +form: FormGroup; - +reportItemModels: List<ReportItemFormViewModel>; + +isStudyReadonly: bool; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestConsent: bool + +titles: Map<FormMode, String> | - +void setControlsFrom(); - +ReportsFormData buildFormData(); +void read(); - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); - +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); - +dynamic testReport(); + +void setControlsFrom(); + +Study buildFormData(); + +void dispose(); +void onCancel(); +dynamic onSave(); - +ReportItemFormViewModel provide() + -dynamic _applyAndSaveSubform() ] - [ReportsFormViewModel]o-[Study] - [ReportsFormViewModel]o-[GoRouter] - [ReportsFormViewModel]o-[ReportFormItemDelegate] - [ReportsFormViewModel]o-[FormArray] - [ReportsFormViewModel]o-[FormViewModelCollection] - [ReportsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[ReportsFormViewModel] + [StudyFormViewModel]o-[Study] + [StudyFormViewModel]o-[<abstract>IStudyRepository] + [StudyFormViewModel]o-[<abstract>IAuthRepository] + [StudyFormViewModel]o-[GoRouter] + [StudyFormViewModel]o-[StudyInfoFormViewModel] + [StudyFormViewModel]o-[EnrollmentFormViewModel] + [StudyFormViewModel]o-[MeasurementsFormViewModel] + [StudyFormViewModel]o-[ReportsFormViewModel] + [StudyFormViewModel]o-[InterventionsFormViewModel] + [StudyFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] - [ReportFormItemDelegate + [<abstract>StudyScheduleControls | - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +owner: ReportsFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic + <static>+defaultScheduleType: PhaseSequence; + <static>+defaultScheduleTypeSequence: String; + <static>+defaultNumCycles: int; + <static>+defaultPeriodLength: int; + +sequenceTypeControl: FormControl<PhaseSequence>; + +sequenceTypeCustomControl: FormControl<String>; + +phaseDurationControl: FormControl<int>; + +numCyclesControl: FormControl<int>; + +includeBaselineControl: FormControl<bool>; + +studyScheduleControls: Map<String, FormControl<Object>>; + <static>+kNumCyclesMin: int; + <static>+kNumCyclesMax: int; + <static>+kPhaseDurationMin: int; + <static>+kPhaseDurationMax: int; + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +numCyclesRange: dynamic; + +phaseDurationRange: dynamic; + +customSequenceRequired: dynamic | - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + +void setStudyScheduleControlsFrom(); + +StudyScheduleFormData buildStudyScheduleFormData(); + +bool isSequencingCustom() ] - [ReportFormItemDelegate]o-[FormViewModelCollection] - [ReportFormItemDelegate]o-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] - [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] - [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] + [<abstract>StudyScheduleControls]o-[PhaseSequence] + [<abstract>StudyScheduleControls]o-[FormControl] - [ReportItemFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: dynamic; - +sectionTypeBodyBuilder: Widget Function(BuildContext) + [StudyDesignInterventionsFormView | - +Widget build(); - -dynamic _buildSectionText(); - -dynamic _buildSectionTypeHeader() + +Widget build() ] - [ReportItemFormView]o-[ReportItemFormViewModel] - [ReportItemFormView]o-[Widget Function(BuildContext)] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] - [TemporalAggregationFormatted + [InterventionFormViewModel | - -_value: TemporalAggregation; - <static>+values: List<TemporalAggregationFormatted>; - +value: TemporalAggregation; - +string: String; - +icon: IconData?; - +hashCode: int + +study: Study; + +interventionIdControl: FormControl<String>; + +interventionTitleControl: FormControl<String>; + +interventionIconControl: FormControl<IconOption>; + +interventionDescriptionControl: FormControl<String>; + +interventionTasksArray: FormArray<dynamic>; + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; + +form: FormGroup; + +interventionId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +atLeastOneTask: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> | - +bool ==(); - +String toString(); - +String toJson(); - <static>+TemporalAggregationFormatted fromJson() + +void setControlsFrom(); + +InterventionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +void onCancel(); + +dynamic onSave(); + +InterventionTaskFormViewModel provide(); + +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); + +InterventionTaskFormRouteArgs buildFormRouteArgs(); + +InterventionFormViewModel createDuplicate() + ] + + [InterventionFormViewModel]o-[Study] + [InterventionFormViewModel]o-[FormControl] + [InterventionFormViewModel]o-[FormArray] + [InterventionFormViewModel]o-[FormViewModelCollection] + [InterventionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] + [<abstract>IListActionProvider]<:--[InterventionFormViewModel] + [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] + + [StudyScheduleFormView + | + +formViewModel: StudyScheduleControls + | + -FormTableRow _renderCustomSequence(); + +Widget build() ] - [TemporalAggregationFormatted]o-[TemporalAggregation] - [TemporalAggregationFormatted]o-[IconData] + [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] + [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] - [ImprovementDirectionFormatted + [StudyScheduleFormData | - -_value: ImprovementDirection; - <static>+values: List<ImprovementDirectionFormatted>; - +value: ImprovementDirection; - +string: String; - +icon: IconData?; - +hashCode: int + +sequenceType: PhaseSequence; + +sequenceTypeCustom: String; + +numCycles: int; + +phaseDuration: int; + +includeBaseline: bool; + +id: String | - +bool ==(); - +String toString(); - +String toJson(); - <static>+ImprovementDirectionFormatted fromJson() + +StudySchedule toStudySchedule(); + +Study apply(); + +StudyScheduleFormData copy() ] - [ImprovementDirectionFormatted]o-[ImprovementDirection] - [ImprovementDirectionFormatted]o-[IconData] + [StudyScheduleFormData]o-[PhaseSequence] + [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - [ReportSectionType + [InterventionFormView | - +index: int; - <static>+values: List<ReportSectionType>; - <static>+average: ReportSectionType; - <static>+linearRegression: ReportSectionType + +formViewModel: InterventionFormViewModel ] - [ReportSectionType]o-[ReportSectionType] - [Enum]<:--[ReportSectionType] + [InterventionFormView]o-[InterventionFormViewModel] - [DataReferenceIdentifier + [InterventionsFormViewModel | - +hashCode: int + +study: Study; + +router: GoRouter; + +interventionsArray: FormArray<dynamic>; + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; + +form: FormGroup; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +interventionsRequired: dynamic; + +titles: Map<FormMode, String>; + +canTestStudySchedule: bool | - +bool ==() + +void setControlsFrom(); + +InterventionsFormData buildFormData(); + +void read(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +InterventionFormViewModel provide(); + +void onCancel(); + +dynamic onSave(); + +dynamic testStudySchedule() ] - [DataReference]<:-[DataReferenceIdentifier] + [InterventionsFormViewModel]o-[Study] + [InterventionsFormViewModel]o-[GoRouter] + [InterventionsFormViewModel]o-[FormArray] + [InterventionsFormViewModel]o-[FormViewModelCollection] + [InterventionsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InterventionsFormViewModel] + [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] + [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] - [DataReferenceEditor + [InterventionTaskFormData | - +formControl: FormControl<DataReferenceIdentifier<T>>; - +availableTasks: List<Task>; - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + +taskId: String; + +taskTitle: String; + +taskDescription: String?; + <static>+kDefaultTitle: String; + +id: String | - +FormTableRow buildFormTableRow(); - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + +CheckmarkTask toTask(); + +InterventionTaskFormData copy() ] - [DataReferenceEditor]o-[FormControl] - [DataReferenceEditor]o-[ReactiveDropdownField] + [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] - [AverageSectionFormView + [InterventionPreview | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + +routeArgs: InterventionFormRouteArgs | +Widget build() ] - [AverageSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[AverageSectionFormView] + [InterventionPreview]o-[InterventionFormRouteArgs] + [<abstract>ConsumerWidget]<:-[InterventionPreview] - [LinearRegressionSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + [InterventionTaskFormView | - +Widget build() + +formViewModel: InterventionTaskFormViewModel ] - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] + [InterventionTaskFormView]o-[InterventionTaskFormViewModel] - [ReportItemFormData + [InterventionsFormData | - +isPrimary: bool; - +section: ReportSection; + +interventionsData: List<InterventionFormData>; + +studyScheduleData: StudyScheduleFormData; +id: String | - <static>+dynamic fromDomainModel(); - +ReportItemFormData copy() + +Study apply(); + +InterventionsFormData copy() ] - [ReportItemFormData]o-[<abstract>ReportSection] - [<abstract>IFormData]<:-[ReportItemFormData] + [InterventionsFormData]o-[StudyScheduleFormData] + [<abstract>IStudyFormData]<:--[InterventionsFormData] - [ReportItemFormViewModel + [InterventionTaskFormViewModel | - <static>+defaultSectionType: ReportSectionType; - +sectionIdControl: FormControl<String>; - +sectionTypeControl: FormControl<ReportSectionType>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +sectionControl: FormControl<ReportSection>; - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; - +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; - +alphaControl: FormControl<double>; - -_controlsBySectionType: Map<ReportSectionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +sectionBaseControls: Map<String, AbstractControl<dynamic>>; + +taskIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +taskTitleControl: FormControl<String>; + +taskDescriptionControl: FormControl<String>; + +markAsCompletedControl: FormControl<bool>; +form: FormGroup; - +sectionId: String; - +sectionType: ReportSectionType; - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; - +titles: Map<FormMode, String>; + +taskId: String; + +instanceId: String; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; +titleRequired: dynamic; - +descriptionRequired: dynamic; - +dataReferenceRequired: dynamic; - +aggregationRequired: dynamic; - +improvementDirectionRequired: dynamic; - +alphaConfidenceRequired: dynamic + +titles: Map<FormMode, String> | - -List<FormControlValidation> _getValidationConfig(); - +ReportItemFormData buildFormData(); - +ReportItemFormViewModel createDuplicate(); - +dynamic onSectionTypeChanged(); - -void _updateFormControls(); - +void setControlsFrom() + +void setControlsFrom(); + +InterventionTaskFormData buildFormData(); + +InterventionTaskFormViewModel createDuplicate() ] - [ReportItemFormViewModel]o-[ReportSectionType] - [ReportItemFormViewModel]o-[FormControl] - [ReportItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] + [InterventionTaskFormViewModel]o-[FormControl] + [InterventionTaskFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] + [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] - [ReportsFormData + [InterventionFormData | - +reportItems: List<ReportItemFormData>; + +interventionId: String; + +title: String; + +description: String?; + +tasksData: List<InterventionTaskFormData>?; + +iconName: String?; + <static>+kDefaultTitle: String; +id: String | - +Study apply(); - +ReportsFormData copy() - ] - - [<abstract>IStudyFormData]<:--[ReportsFormData] - - [ReportStatus - | - +index: int; - <static>+values: List<ReportStatus>; - <static>+primary: ReportStatus; - <static>+secondary: ReportStatus - ] - - [ReportStatus]o-[ReportStatus] - [Enum]<:--[ReportStatus] - - [ReportBadge - | - +status: ReportStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool - | - +Widget build() + +Intervention toIntervention(); + +InterventionFormData copy() ] - [ReportBadge]o-[ReportStatus] - [ReportBadge]o-[BadgeType] + [<abstract>IFormData]<:-[InterventionFormData] - + - + - - - - - - - - - - - + + + + + - + - + - + - + - + - + + + - + - - - + + - - - + + + - + + - + - + - + - - + + - - - - - - - - - - + - + + + + - - - - + - - - - + - + - + - + - - - + - + - - - + - + - - + + - - - - - - + - - - + + + - - - + + + - - - + + + - + + - + - + - + - + - - - - - - + + + + + + + + - + - + - + - + - + - - + + - + - + + + - - - - - - - - + - - - - - - - - + + + - + - + - - + + - + - + - + - - - - - + - + - + - - - - + - - + - + - + - + - - - + + + + - - - + + + - + + - + - + - + - - - - - + - + - + - + - + - - - - + + - + - - - + - + - + - + - + + + + + - + - + - + - + - + - - - - + + + - - - + + + + + + + + + + + - - + - - + + - + - + + + - + - - - - - + - + - - - - + + + - - + + + - + + + - + + + + + + - - + - - - - + + + + - + - + - + - + + + + + - + - - - + - + - + + + + + - + - + - + - + + + - + - + + + - + - - + + - + - - - + + + + - - - + + + - - - - + - + - - - + - + - + - + - + - + - + - - - - - - - - + + + + + + - + - + - + - + - + + + + + + - - + - + - - - + - + - + - - - - - - + + + - + + - + - - - + - + - + - + - + - + - + + + + + + - - + + + - + + + + - - - + + - + - + + + - + - + + + - + - + - + - - - + + + + + + + + + + - - + + + - + - - - - - - - - - + - + - - - + - + - + - + + + - + - - + + - + - - - + - + - - - + - + - - - - - - - - - - + + - + - + - + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - + - - + - + - + - + - - + + + - - - + + + - + + - + - - + + - + - + - + - + + + - + - + - + - + - + - + - + - + - + + + + + + + + + + + - + - - - - + + - + - + + + - + + + + - + + - + - - - + - + - - - + - + - - - + - + - + - + - + - + + + + + + + + + + + + - - + - + + + + + + + + + + + + + + - - + - + - + - - + + - + - + - + + + + + + + + + + + + + + + + StudyDesignInfoFormView + + + + + + +Widget build() + + + - - - - - + + + + - - - StudyFormViewModel + + + StudyDesignPageWidget - - - +studyDirtyCopy: Study? - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +router: GoRouter - +studyInfoFormViewModel: StudyInfoFormViewModel - +enrollmentFormViewModel: EnrollmentFormViewModel - +measurementsFormViewModel: MeasurementsFormViewModel - +reportsFormViewModel: ReportsFormViewModel - +interventionsFormViewModel: InterventionsFormViewModel - +form: FormGroup - +isStudyReadonly: bool - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> + + + +Widget? banner() - - - +void read() - +void setControlsFrom() - +Study buildFormData() - +void dispose() - +void onCancel() - +dynamic onSave() - -dynamic _applyAndSaveSubform() + + + + + + + + + + StudyInfoFormViewModel + + + + + + +study: Study + +titleControl: FormControl<String> + +iconControl: FormControl<IconOption> + +descriptionControl: FormControl<String> + +organizationControl: FormControl<String> + +reviewBoardControl: FormControl<String> + +reviewBoardNumberControl: FormControl<String> + +researchersControl: FormControl<String> + +emailControl: FormControl<String> + +websiteControl: FormControl<String> + +phoneControl: FormControl<String> + +additionalInfoControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +iconRequired: dynamic + +organizationRequired: dynamic + +reviewBoardRequired: dynamic + +reviewBoardNumberRequired: dynamic + +researchersRequired: dynamic + +emailRequired: dynamic + +phoneRequired: dynamic + +emailFormat: dynamic + +websiteFormat: dynamic + + + + + + +void setControlsFrom() + +StudyInfoFormData buildFormData() - + - + Study - - - + + + + + + + FormControl + + + + + + + + + + + FormGroup + + + + + + + + + + + FormViewModel + + + + + + + + + + + + + StudyInfoFormData + + + + + + +title: String + +description: String? + +iconName: String + +contactInfoFormData: StudyContactInfoFormData + +id: String + + + + + + +Study apply() + +StudyInfoFormData copy() + + + + + + + + + + + + + StudyContactInfoFormData + + + + + + +organization: String? + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String? + +website: String? + +phone: String? + +additionalInfo: String? + +id: String + + + + + + +Study apply() + +StudyInfoFormData copy() + + + + + + + + + + + + IStudyFormData + + + + + + +Study apply() + + + + + + + + + + + + + StudyFormScaffold + + + + + + +studyId: String + +formViewModelBuilder: T Function(WidgetRef) + +formViewBuilder: Widget Function(T) + + + + + + +Widget build() + + + + + + + - - - IStudyRepository + + + T Function(WidgetRef) - - - + + + - - - IAuthRepository + + + Widget Function(T) - - - + + + - - - GoRouter + + + ConsumerWidget - - - - - - - - - StudyInfoFormViewModel - - + + + + - - - +study: Study - +titleControl: FormControl<String> - +iconControl: FormControl<IconOption> - +descriptionControl: FormControl<String> - +organizationControl: FormControl<String> - +reviewBoardControl: FormControl<String> - +reviewBoardNumberControl: FormControl<String> - +researchersControl: FormControl<String> - +emailControl: FormControl<String> - +websiteControl: FormControl<String> - +phoneControl: FormControl<String> - +additionalInfoControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +iconRequired: dynamic - +organizationRequired: dynamic - +reviewBoardRequired: dynamic - +reviewBoardNumberRequired: dynamic - +researchersRequired: dynamic - +emailRequired: dynamic - +phoneRequired: dynamic - +emailFormat: dynamic - +websiteFormat: dynamic + + + StudyFormValidationSet - - - +void setControlsFrom() - +StudyInfoFormData buildFormData() + + + +index: int + <static>+values: List<StudyFormValidationSet> - - - - - + + + - - - EnrollmentFormViewModel + + + Enum - - - +study: Study - +router: GoRouter - +consentItemDelegate: EnrollmentFormConsentItemDelegate - +enrollmentTypeControl: FormControl<Participation> - +consentItemArray: FormArray<dynamic> - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +form: FormGroup - +enrollmentTypeControlOptions: List<FormControlOption<Participation>> - +consentItemModels: List<ConsentItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestScreener: bool - +canTestConsent: bool - +questionTitles: Map<FormMode, String Function()> + + + + + + + + + StudyDesignMeasurementsFormView - - - +void setControlsFrom() - +EnrollmentFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() - +dynamic testScreener() - +dynamic testConsent() - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + + + +Widget build() - - - + + + - + MeasurementsFormViewModel - + +study: Study +router: GoRouter @@ -2145,7 +2276,7 @@ - + +void read() +void setControlsFrom() @@ -2162,1482 +2293,1375 @@ - - - - - - - - - ReportsFormViewModel - - - - - - +study: Study - +router: GoRouter - +reportItemDelegate: ReportFormItemDelegate - +reportItemArray: FormArray<dynamic> - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +form: FormGroup - +reportItemModels: List<ReportItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestConsent: bool - - - - - - +void setControlsFrom() - +ReportsFormData buildFormData() - +void read() - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() - +ReportItemFormRouteArgs buildReportItemFormRouteArgs() - +dynamic testReport() - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() - - - - - - - - - - - - - InterventionsFormViewModel - - - - - - +study: Study - +router: GoRouter - +interventionsArray: FormArray<dynamic> - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> - +form: FormGroup - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +interventionsRequired: dynamic - +titles: Map<FormMode, String> - +canTestStudySchedule: bool - - - - - - +void setControlsFrom() - +InterventionsFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +InterventionFormViewModel provide() - +void onCancel() - +dynamic onSave() - +dynamic testStudySchedule() - - - - - - - - - - - FormGroup - - - - - - - - - - - FormViewModel - - - - - - - - - - - IFormViewModelDelegate - - - - - - - - - - - - ConsentItemFormView - - + + + - - - +formViewModel: ConsentItemFormViewModel + + + GoRouter - - - - - - - - - ConsentItemFormViewModel - - - - - - +consentIdControl: FormControl<String> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +iconControl: FormControl<IconOption> - +form: FormGroup - +consentId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +titles: Map<FormMode, String> - - + + + - - - +void setControlsFrom() - +ConsentItemFormData buildFormData() - +ConsentItemFormViewModel createDuplicate() + + + FormArray - - - - - + + + - - - EnrollmentFormData + + + FormViewModelCollection - - - <static>+kDefaultEnrollmentType: Participation - +enrollmentType: Participation - +questionnaireFormData: QuestionnaireFormData - +consentItemsFormData: List<ConsentItemFormData>? - +id: String + + + + + + + + IFormViewModelDelegate - - - +Study apply() - +EnrollmentFormData copy() + + + + + + + + IListActionProvider - - - + + + - - - Participation + + + IProviderArgsResolver - - - - - + + + + + - - - QuestionnaireFormData + + + MeasurementsFormData - - - +questionsData: List<QuestionFormData>? - +id: String + + + +surveyMeasurements: List<MeasurementSurveyFormData> + +id: String - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() + + + +Study apply() + +MeasurementsFormData copy() - - - - + + + + + - - - IStudyFormData + + + MeasurementSurveyFormViewModel - - - +Study apply() + + + +study: Study + +measurementIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +surveyTitleControl: FormControl<String> + +surveyIntroTextControl: FormControl<String> + +surveyOutroTextControl: FormControl<String> + +form: FormGroup + +measurementId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneQuestion: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - - - - - - - StudyDesignEnrollmentFormView + + + +void setControlsFrom() + +MeasurementSurveyFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() + +SurveyQuestionFormRouteArgs buildFormRouteArgs() + +MeasurementSurveyFormViewModel createDuplicate() - - - +Widget build() - -dynamic _showScreenerQuestionSidesheetWithArgs() - -dynamic _showConsentItemSidesheetWithArgs() + + + + + + + + ManagedFormViewModel - - - - + + + + + - - - StudyDesignPageWidget + + + WithQuestionnaireControls - - - +Widget? banner() + + + +questionsArray: FormArray<dynamic> + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> + +questionnaireControls: Map<String, FormArray<dynamic>> + +propagateOnSave: bool + +questionModels: List<Q> + +questionTitles: Map<FormMode, String Function()> + + + + + + +void setQuestionnaireControlsFrom() + +QuestionnaireFormData buildQuestionnaireFormData() + +void read() + +void onCancel() + +dynamic onSave() + +Q provide() + +Q provideQuestionFormViewModel() - - - + + + + + - - - FormControl + + + WithScheduleControls - - - - + + + +isTimeRestrictedControl: FormControl<bool> + +instanceID: FormControl<String> + +restrictedTimeStartControl: FormControl<Time> + +restrictedTimeStartPickerControl: FormControl<TimeOfDay> + +restrictedTimeEndControl: FormControl<Time> + +restrictedTimeEndPickerControl: FormControl<TimeOfDay> + +hasReminderControl: FormControl<bool> + +reminderTimeControl: FormControl<Time> + +reminderTimePickerControl: FormControl<TimeOfDay> + -_reminderControlStream: StreamSubscription<dynamic>? + +scheduleFormControls: Map<String, FormControl<Object>> + +hasReminder: bool + +isTimeRestricted: bool + +timeRestriction: List<Time>? + + - - - ManagedFormViewModel + + + +void setScheduleControlsFrom() + -dynamic _initReminderControl() - - - - + + + + + - - - IScreenerQuestionLogicFormViewModel + + + MeasurementSurveyFormData - - - +isDirtyOptionsBannerVisible: bool + + + +measurementId: String + +title: String + +introText: String? + +outroText: String? + +questionnaireFormData: QuestionnaireFormData + <static>+kDefaultTitle: String + +id: String + + + + + + +QuestionnaireTask toQuestionnaireTask() + +MeasurementSurveyFormData copy() - - - - - + + + + + - - - ScreenerQuestionLogicFormView + + + QuestionnaireFormData - - - +formViewModel: ScreenerQuestionFormViewModel + + + +questionsData: List<QuestionFormData>? + +id: String - - - +Widget build() - -dynamic _buildInfoBanner() - -dynamic _buildAnswerOptionsLogicControls() - -List<Widget> _buildOptionLogicRow() + + + +StudyUQuestionnaire toQuestionnaire() + +List<EligibilityCriterion> toEligibilityCriteria() + +QuestionnaireFormData copy() - - - - - + + + + + - - - ScreenerQuestionFormViewModel + + + IFormDataWithSchedule - - - <static>+defaultResponseOptionValidity: bool - +responseOptionsDisabledArray: FormArray<dynamic> - +responseOptionsLogicControls: FormArray<bool> - +responseOptionsLogicDescriptionControls: FormArray<String> - -_questionBaseControls: Map<String, AbstractControl<dynamic>> - +prevResponseOptionControls: List<AbstractControl<dynamic>> - +prevResponseOptionValues: List<dynamic> - +responseOptionsDisabledControls: List<AbstractControl<dynamic>> - +logicControlOptions: List<FormControlOption<bool>> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isDirtyOptionsBannerVisible: bool + + + +instanceId: String + +isTimeLocked: bool + +timeLockStart: StudyUTimeOfDay? + +timeLockEnd: StudyUTimeOfDay? + +hasReminder: bool + +reminderTime: StudyUTimeOfDay? - - - - - +dynamic onResponseOptionsChanged() - +void setControlsFrom() - +QuestionFormData buildFormData() - -List<FormControl<dynamic>> _copyFormControls() - -AbstractControl<dynamic>? _findAssociatedLogicControlFor() - -AbstractControl<dynamic>? _findAssociatedControlFor() - +ScreenerQuestionFormViewModel createDuplicate() + + + + + +Schedule toSchedule() - - - + + + + + - - - FormConsumerWidget + + + SurveyPreview - - - - + + + +routeArgs: MeasurementFormRouteArgs + + - - - FormArray + + + +Widget build() - - - - - + + + - - - QuestionFormViewModel + + + MeasurementFormRouteArgs - - - <static>+defaultQuestionType: SurveyQuestionType - -_titles: Map<FormMode, String Function()>? - +questionIdControl: FormControl<String> - +questionTypeControl: FormControl<SurveyQuestionType> - +questionTextControl: FormControl<String> - +questionInfoTextControl: FormControl<String> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isMultipleChoiceControl: FormControl<bool> - +choiceResponseOptionsArray: FormArray<dynamic> - +customOptionsMin: int - +customOptionsMax: int - +customOptionsInitial: int - +boolResponseOptionsArray: FormArray<String> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool + + + + + + + + + MeasurementSurveyFormView - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +QuestionFormViewModel createDuplicate() + + + +formViewModel: MeasurementSurveyFormViewModel - - - - - + + + - - - EnrollmentFormConsentItemDelegate + + + IFormData - - - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +owner: EnrollmentFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + + + + + + + + ReportsFormViewModel - - - +void onCancel() - +dynamic onSave() - +ConsentItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +study: Study + +router: GoRouter + +reportItemDelegate: ReportFormItemDelegate + +reportItemArray: FormArray<dynamic> + +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +form: FormGroup + +reportItemModels: List<ReportItemFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + +canTestConsent: bool - - - - - - - - FormViewModelCollection + + + +void setControlsFrom() + +ReportsFormData buildFormData() + +void read() + +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() + +ReportItemFormRouteArgs buildReportItemFormRouteArgs() + +dynamic testReport() + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() - - - - - + + + + + - - - WithQuestionnaireControls + + + ReportFormItemDelegate - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> + + + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +owner: ReportsFormViewModel + +propagateOnSave: bool + +validationSet: dynamic - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() + + + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - + + + + + - - - IListActionProvider + + + ReportItemFormView - - - - + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: dynamic + +sectionTypeBodyBuilder: Widget Function(BuildContext) + + - - - IProviderArgsResolver + + + +Widget build() + -dynamic _buildSectionText() + -dynamic _buildSectionTypeHeader() - - - - - + + + + + - - - ConsentItemFormData + + + ReportItemFormViewModel - - - +consentId: String - +title: String - +description: String - +iconName: String? - +id: String + + + <static>+defaultSectionType: ReportSectionType + +sectionIdControl: FormControl<String> + +sectionTypeControl: FormControl<ReportSectionType> + +titleControl: FormControl<String> + +descriptionControl: FormControl<String> + +sectionControl: FormControl<ReportSection> + +dataReferenceControl: FormControl<DataReferenceIdentifier<num>> + +temporalAggregationControl: FormControl<TemporalAggregationFormatted> + +improvementDirectionControl: FormControl<ImprovementDirectionFormatted> + +alphaControl: FormControl<double> + -_controlsBySectionType: Map<ReportSectionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +sectionBaseControls: Map<String, AbstractControl<dynamic>> + +form: FormGroup + +sectionId: String + +sectionType: ReportSectionType + <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>> + <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>> + <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>> + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +dataReferenceRequired: dynamic + +aggregationRequired: dynamic + +improvementDirectionRequired: dynamic + +alphaConfidenceRequired: dynamic - - - +ConsentItem toConsentItem() - +ConsentItemFormData copy() + + + -List<FormControlValidation> _getValidationConfig() + +ReportItemFormData buildFormData() + +ReportItemFormViewModel createDuplicate() + +dynamic onSectionTypeChanged() + -void _updateFormControls() + +void setControlsFrom() - - - + + + - - - IFormData + + + Widget Function(BuildContext) - - - - - + + + + + - - - InterventionsFormData + + + LinearRegressionSectionFormView - - - +interventionsData: List<InterventionFormData> - +studyScheduleData: StudyScheduleFormData - +id: String + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - +Study apply() - +InterventionsFormData copy() + + + +Widget build() - - - - - + + + + + - - - StudyScheduleFormData + + + DataReferenceIdentifier - - - +sequenceType: PhaseSequence - +sequenceTypeCustom: String - +numCycles: int - +phaseDuration: int - +includeBaseline: bool - +id: String + + + +hashCode: int - - - +StudySchedule toStudySchedule() - +Study apply() - +StudyScheduleFormData copy() + + + +bool ==() - - - - - - - - - InterventionTaskFormViewModel - - - - - - +taskIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +taskTitleControl: FormControl<String> - +taskDescriptionControl: FormControl<String> - +markAsCompletedControl: FormControl<bool> - +form: FormGroup - +taskId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +titles: Map<FormMode, String> - - + + + - - - +void setControlsFrom() - +InterventionTaskFormData buildFormData() - +InterventionTaskFormViewModel createDuplicate() + + + DataReference - - - - - + + + + + - - - WithScheduleControls + + + DataReferenceEditor - - - +isTimeRestrictedControl: FormControl<bool> - +instanceID: FormControl<String> - +restrictedTimeStartControl: FormControl<Time> - +restrictedTimeStartPickerControl: FormControl<TimeOfDay> - +restrictedTimeEndControl: FormControl<Time> - +restrictedTimeEndPickerControl: FormControl<TimeOfDay> - +hasReminderControl: FormControl<bool> - +reminderTimeControl: FormControl<Time> - +reminderTimePickerControl: FormControl<TimeOfDay> - -_reminderControlStream: StreamSubscription<dynamic>? - +scheduleFormControls: Map<String, FormControl<Object>> - +hasReminder: bool - +isTimeRestricted: bool - +timeRestriction: List<Time>? + + + +formControl: FormControl<DataReferenceIdentifier<T>> + +availableTasks: List<Task> + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - +void setScheduleControlsFrom() - -dynamic _initReminderControl() + + + +FormTableRow buildFormTableRow() + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - - - - - - InterventionTaskFormView - - + + + - - - +formViewModel: InterventionTaskFormViewModel + + + ReactiveDropdownField - - - + + + + + - - - PhaseSequence + + + TemporalAggregationFormatted - - - - - - - - - InterventionFormView + + + -_value: TemporalAggregation + <static>+values: List<TemporalAggregationFormatted> + +value: TemporalAggregation + +string: String + +icon: IconData? + +hashCode: int - - - +formViewModel: InterventionFormViewModel + + + +bool ==() + +String toString() + +String toJson() + <static>+TemporalAggregationFormatted fromJson() - - - - - + + + - - - InterventionFormViewModel + + + TemporalAggregation - - - +study: Study - +interventionIdControl: FormControl<String> - +interventionTitleControl: FormControl<String> - +interventionIconControl: FormControl<IconOption> - +interventionDescriptionControl: FormControl<String> - +interventionTasksArray: FormArray<dynamic> - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> - +form: FormGroup - +interventionId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneTask: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> - - + + + + - - - +void setControlsFrom() - +InterventionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +void onCancel() - +dynamic onSave() - +InterventionTaskFormViewModel provide() - +InterventionTaskFormRouteArgs buildNewFormRouteArgs() - +InterventionTaskFormRouteArgs buildFormRouteArgs() - +InterventionFormViewModel createDuplicate() + + + IconData - - - - - + + + + + - - - StudyScheduleControls + + + ImprovementDirectionFormatted - - - <static>+defaultScheduleType: PhaseSequence - <static>+defaultScheduleTypeSequence: String - <static>+defaultNumCycles: int - <static>+defaultPeriodLength: int - +sequenceTypeControl: FormControl<PhaseSequence> - +sequenceTypeCustomControl: FormControl<String> - +phaseDurationControl: FormControl<int> - +numCyclesControl: FormControl<int> - +includeBaselineControl: FormControl<bool> - +studyScheduleControls: Map<String, FormControl<Object>> - <static>+kNumCyclesMin: int - <static>+kNumCyclesMax: int - <static>+kPhaseDurationMin: int - <static>+kPhaseDurationMax: int - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +numCyclesRange: dynamic - +phaseDurationRange: dynamic - +customSequenceRequired: dynamic + + + -_value: ImprovementDirection + <static>+values: List<ImprovementDirectionFormatted> + +value: ImprovementDirection + +string: String + +icon: IconData? + +hashCode: int - - - - - +void setStudyScheduleControlsFrom() - +StudyScheduleFormData buildStudyScheduleFormData() - +bool isSequencingCustom() + + + + + +bool ==() + +String toString() + +String toJson() + <static>+ImprovementDirectionFormatted fromJson() - - - - - + + + - - - InterventionFormData + + + ImprovementDirection - - - +interventionId: String - +title: String - +description: String? - +tasksData: List<InterventionTaskFormData>? - +iconName: String? - <static>+kDefaultTitle: String - +id: String + + + + + + + + + ReportSectionType - - - +Intervention toIntervention() - +InterventionFormData copy() + + + +index: int + <static>+values: List<ReportSectionType> + <static>+average: ReportSectionType + <static>+linearRegression: ReportSectionType - - - - - + + + + + - - - StudyScheduleFormView + + + AverageSectionFormView - - - +formViewModel: StudyScheduleControls + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - -FormTableRow _renderCustomSequence() - +Widget build() + + + +Widget build() - - - - + + + + + - - - StudyDesignInterventionsFormView + + + ReportItemFormData - - - +Widget build() + + + +isPrimary: bool + +section: ReportSection + +id: String - - - - - - - - - - InterventionTaskFormData + + + <static>+dynamic fromDomainModel() + +ReportItemFormData copy() - - - +taskId: String - +taskTitle: String - +taskDescription: String? - <static>+kDefaultTitle: String - +id: String - - + + + + - - - +CheckmarkTask toTask() - +InterventionTaskFormData copy() + + + ReportSection - - - - - + + + + + - - - IFormDataWithSchedule + + + ReportsFormData - - - +instanceId: String - +isTimeLocked: bool - +timeLockStart: StudyUTimeOfDay? - +timeLockEnd: StudyUTimeOfDay? - +hasReminder: bool - +reminderTime: StudyUTimeOfDay? + + + +reportItems: List<ReportItemFormData> + +id: String - - - +Schedule toSchedule() + + + +Study apply() + +ReportsFormData copy() - - - - - - - - - InterventionPreview - - + + + + - - - +routeArgs: InterventionFormRouteArgs + + + ReportStatus - - - +Widget build() + + + +index: int + <static>+values: List<ReportStatus> + <static>+primary: ReportStatus + <static>+secondary: ReportStatus - - - + + + + - - - InterventionFormRouteArgs + + + StudyDesignReportsFormView - - - - - - - - ConsumerWidget + + + +Widget build() + -dynamic _showReportItemSidesheetWithArgs() - - - - + + + + + - - - StudyFormValidationSet + + + ReportBadge - - - +index: int - <static>+values: List<StudyFormValidationSet> + + + +status: ReportStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool - - - - - - - - Enum + + + +Widget build() - - - - - + + + - - - StudyInfoFormData + + + BadgeType - - - +title: String - +description: String? - +iconName: String - +contactInfoFormData: StudyContactInfoFormData - +id: String + + + + + + + + + StudyDesignEnrollmentFormView - - - +Study apply() - +StudyInfoFormData copy() + + + +Widget build() + -dynamic _showScreenerQuestionSidesheetWithArgs() + -dynamic _showConsentItemSidesheetWithArgs() - - - - - + + + + + - - - StudyContactInfoFormData + + + ConsentItemFormData - - - +organization: String? - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String? - +website: String? - +phone: String? - +additionalInfo: String? - +id: String + + + +consentId: String + +title: String + +description: String + +iconName: String? + +id: String - - - +Study apply() - +StudyInfoFormData copy() + + + +ConsentItem toConsentItem() + +ConsentItemFormData copy() - - - - + + + + + - - - StudyDesignInfoFormView + + + EnrollmentFormData + + + + + + <static>+kDefaultEnrollmentType: Participation + +enrollmentType: Participation + +questionnaireFormData: QuestionnaireFormData + +consentItemsFormData: List<ConsentItemFormData>? + +id: String + + + + + + +Study apply() + +EnrollmentFormData copy() - - - +Widget build() + + + + + + + + Participation - - - - + + + + + - - - StudyDesignMeasurementsFormView + + + ConsentItemFormViewModel - - - +Widget build() + + + +consentIdControl: FormControl<String> + +titleControl: FormControl<String> + +descriptionControl: FormControl<String> + +iconControl: FormControl<IconOption> + +form: FormGroup + +consentId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +titles: Map<FormMode, String> - - - - - - - - - - SurveyPreview + + + +void setControlsFrom() + +ConsentItemFormData buildFormData() + +ConsentItemFormViewModel createDuplicate() - - - +routeArgs: MeasurementFormRouteArgs + + + + + + + + + IScreenerQuestionLogicFormViewModel - - - +Widget build() + + + +isDirtyOptionsBannerVisible: bool - - - + + + + + - - - MeasurementFormRouteArgs + + + ScreenerQuestionLogicFormView - - - - - - - - - MeasurementSurveyFormView + + + +formViewModel: ScreenerQuestionFormViewModel - - - +formViewModel: MeasurementSurveyFormViewModel + + + +Widget build() + -dynamic _buildInfoBanner() + -dynamic _buildAnswerOptionsLogicControls() + -List<Widget> _buildOptionLogicRow() - - - - - + + + + + - - - MeasurementSurveyFormViewModel + + + ScreenerQuestionFormViewModel - - - +study: Study - +measurementIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +surveyTitleControl: FormControl<String> - +surveyIntroTextControl: FormControl<String> - +surveyOutroTextControl: FormControl<String> - +form: FormGroup - +measurementId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneQuestion: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> + + + <static>+defaultResponseOptionValidity: bool + +responseOptionsDisabledArray: FormArray<dynamic> + +responseOptionsLogicControls: FormArray<bool> + +responseOptionsLogicDescriptionControls: FormArray<String> + -_questionBaseControls: Map<String, AbstractControl<dynamic>> + +prevResponseOptionControls: List<AbstractControl<dynamic>> + +prevResponseOptionValues: List<dynamic> + +responseOptionsDisabledControls: List<AbstractControl<dynamic>> + +logicControlOptions: List<FormControlOption<bool>> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isDirtyOptionsBannerVisible: bool - - - +void setControlsFrom() - +MeasurementSurveyFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() - +SurveyQuestionFormRouteArgs buildFormRouteArgs() - +MeasurementSurveyFormViewModel createDuplicate() + + + +dynamic onResponseOptionsChanged() + +void setControlsFrom() + +QuestionFormData buildFormData() + -List<FormControl<dynamic>> _copyFormControls() + -AbstractControl<dynamic>? _findAssociatedLogicControlFor() + -AbstractControl<dynamic>? _findAssociatedControlFor() + +ScreenerQuestionFormViewModel createDuplicate() - - - - - + + + - - - MeasurementSurveyFormData + + + FormConsumerWidget - - - +measurementId: String - +title: String - +introText: String? - +outroText: String? - +questionnaireFormData: QuestionnaireFormData - <static>+kDefaultTitle: String - +id: String + + + + + + + + + + QuestionFormViewModel - - - +QuestionnaireTask toQuestionnaireTask() - +MeasurementSurveyFormData copy() + + + <static>+defaultQuestionType: SurveyQuestionType + -_titles: Map<FormMode, String Function()>? + +questionIdControl: FormControl<String> + +questionTypeControl: FormControl<SurveyQuestionType> + +questionTextControl: FormControl<String> + +questionInfoTextControl: FormControl<String> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isMultipleChoiceControl: FormControl<bool> + +choiceResponseOptionsArray: FormArray<dynamic> + +customOptionsMin: int + +customOptionsMax: int + +customOptionsInitial: int + +boolResponseOptionsArray: FormArray<String> + <static>+kDefaultScaleMinValue: int + <static>+kDefaultScaleMaxValue: int + <static>+kNumMidValueControls: int + <static>+kMidValueDebounceMilliseconds: int + +scaleMinValueControl: FormControl<int> + +scaleMaxValueControl: FormControl<int> + -_scaleRangeControl: FormControl<int> + +scaleMinLabelControl: FormControl<String> + +scaleMaxLabelControl: FormControl<String> + +scaleMidValueControls: FormArray<int> + +scaleMidLabelControls: FormArray<String?> + -_scaleResponseOptionsArray: FormArray<int> + +scaleMinColorControl: FormControl<SerializableColor> + +scaleMaxColorControl: FormControl<SerializableColor> + +prevMidValues: List<int?>? + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +form: FormGroup + +questionId: String + +questionType: SurveyQuestionType + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> + +answerOptionsArray: FormArray<dynamic> + +answerOptionsControls: List<AbstractControl<dynamic>> + +validAnswerOptions: List<String> + +boolOptions: List<AbstractControl<String>> + +scaleMinValue: int + +scaleMaxValue: int + +scaleRange: int + +scaleAllValueControls: List<AbstractControl<int>> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +questionTextRequired: dynamic + +numValidChoiceOptions: dynamic + +scaleRangeValid: dynamic + +titles: Map<FormMode, String> + +isAddOptionButtonVisible: bool + +isMidValuesClearedInfoVisible: bool - - - - - - - - - - MeasurementsFormData + + + +String? scaleMidLabelAt() + -dynamic _onScaleRangeChanged() + -dynamic _applyInputFormatters() + -dynamic _updateScaleMidValueControls() + -List<FormControlValidation> _getValidationConfig() + +dynamic onQuestionTypeChanged() + +dynamic onResponseOptionsChanged() + -void _updateFormControls() + +void initControls() + +void setControlsFrom() + +QuestionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() + +QuestionFormViewModel createDuplicate() - - - +surveyMeasurements: List<MeasurementSurveyFormData> - +id: String + + + + + + + + + + EnrollmentFormViewModel - - - +Study apply() - +MeasurementsFormData copy() + + + +study: Study + +router: GoRouter + +consentItemDelegate: EnrollmentFormConsentItemDelegate + +enrollmentTypeControl: FormControl<Participation> + +consentItemArray: FormArray<dynamic> + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +form: FormGroup + +enrollmentTypeControlOptions: List<FormControlOption<Participation>> + +consentItemModels: List<ConsentItemFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + +canTestScreener: bool + +canTestConsent: bool + +questionTitles: Map<FormMode, String Function()> - - - - - - - - StudyPageWidget + + + +void setControlsFrom() + +EnrollmentFormData buildFormData() + +void read() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() + +dynamic testScreener() + +dynamic testConsent() + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() - - - - - + + + + + - - - StudyFormScaffold + + + EnrollmentFormConsentItemDelegate - - - +studyId: String - +formViewModelBuilder: T Function(WidgetRef) - +formViewBuilder: Widget Function(T) + + + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +owner: EnrollmentFormViewModel + +propagateOnSave: bool + +validationSet: dynamic - - - +Widget build() + + + +void onCancel() + +dynamic onSave() + +ConsentItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - + + + + - - - T Function(WidgetRef) + + + ConsentItemFormView - - - - - - - - Widget Function(T) + + + +formViewModel: ConsentItemFormViewModel - + - + StreamSubscription @@ -3646,9 +3670,9 @@ - + - + StudyUTimeOfDay @@ -3657,23 +3681,23 @@ - - - + + + - + ScheduleControls - + +formViewModel: WithScheduleControls - + +Widget build() -List<FormTableRow> _conditionalTimeRestrictions() @@ -3683,16 +3707,16 @@ - - + + - + SurveyQuestionType - + +index: int <static>+values: List<SurveyQuestionType> @@ -3703,19 +3727,105 @@ + + + + + + + + + ChoiceQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() + + + + + + + + + + + + + BoolQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() + + + + + + + + + + + + IScaleQuestionFormViewModel + + + + + + +isMidValuesClearedInfoVisible: bool + + + + + + + + + + + + ScaleQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + - - - + + + - + QuestionFormData - + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> +questionId: String @@ -3728,7 +3838,7 @@ - + +Question<dynamic> toQuestion() +EligibilityCriterion toEligibilityCriterion() @@ -3741,17 +3851,17 @@ - - - + + + - + ChoiceQuestionFormData - + +isMultipleChoice: bool +answerOptions: List<String> @@ -3759,7 +3869,7 @@ - + +Question<dynamic> toQuestion() +QuestionFormData copy() @@ -3771,24 +3881,24 @@ - - - + + + - + BoolQuestionFormData - + <static>+kResponseOptions: Map<String, bool> +responseOptions: List<String> - + +Question<dynamic> toQuestion() +BoolQuestionFormData copy() @@ -3799,17 +3909,17 @@ - - - + + + - + ScaleQuestionFormData - + +minValue: double +maxValue: double @@ -3818,660 +3928,550 @@ +midValues: List<double?> +midLabels: List<String?> +stepSize: double - +initialValue: double? - +minColor: Color? - +maxColor: Color? - +responseOptions: List<double> - +midAnnotations: List<Annotation> - - - - - - +ScaleQuestion toQuestion() - +QuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - Color - - - - - - - - - - - - IScaleQuestionFormViewModel - - - - - - +isMidValuesClearedInfoVisible: bool - - - - - - - - - - - - ScaleQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - - - - - - - - BoolQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - - ChoiceQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - SurveyQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool - - - - - - - - - - - - StudyDesignReportsFormView - - - - - - +Widget build() - -dynamic _showReportItemSidesheetWithArgs() - - - - - - - - - - - - - ReportFormItemDelegate + +initialValue: double? + +minColor: Color? + +maxColor: Color? + +responseOptions: List<double> + +midAnnotations: List<Annotation> - - - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +owner: ReportsFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + +ScaleQuestion toQuestion() + +QuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + + + + + + Color - - - - - + + + + - - - ReportItemFormView + + + SurveyQuestionFormView - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: dynamic - +sectionTypeBodyBuilder: Widget Function(BuildContext) + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool - - - +Widget build() - -dynamic _buildSectionText() - -dynamic _buildSectionTypeHeader() + + + + + + + + StudyPageWidget - - - - - + + + + + - - - ReportItemFormViewModel + + + StudyFormViewModel - - - <static>+defaultSectionType: ReportSectionType - +sectionIdControl: FormControl<String> - +sectionTypeControl: FormControl<ReportSectionType> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +sectionControl: FormControl<ReportSection> - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>> - +temporalAggregationControl: FormControl<TemporalAggregationFormatted> - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted> - +alphaControl: FormControl<double> - -_controlsBySectionType: Map<ReportSectionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +sectionBaseControls: Map<String, AbstractControl<dynamic>> - +form: FormGroup - +sectionId: String - +sectionType: ReportSectionType - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>> - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>> - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>> - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +dataReferenceRequired: dynamic - +aggregationRequired: dynamic - +improvementDirectionRequired: dynamic - +alphaConfidenceRequired: dynamic + + + +studyDirtyCopy: Study? + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +router: GoRouter + +studyInfoFormViewModel: StudyInfoFormViewModel + +enrollmentFormViewModel: EnrollmentFormViewModel + +measurementsFormViewModel: MeasurementsFormViewModel + +reportsFormViewModel: ReportsFormViewModel + +interventionsFormViewModel: InterventionsFormViewModel + +form: FormGroup + +isStudyReadonly: bool + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> - - - -List<FormControlValidation> _getValidationConfig() - +ReportItemFormData buildFormData() - +ReportItemFormViewModel createDuplicate() - +dynamic onSectionTypeChanged() - -void _updateFormControls() - +void setControlsFrom() + + + +void read() + +void setControlsFrom() + +Study buildFormData() + +void dispose() + +void onCancel() + +dynamic onSave() + -dynamic _applyAndSaveSubform() - - - + + + - - - Widget Function(BuildContext) + + + IStudyRepository - - - - - + + + - - - TemporalAggregationFormatted + + + IAuthRepository - - - -_value: TemporalAggregation - <static>+values: List<TemporalAggregationFormatted> - +value: TemporalAggregation - +string: String - +icon: IconData? - +hashCode: int - - + + + + + + - - - +bool ==() - +String toString() - +String toJson() - <static>+TemporalAggregationFormatted fromJson() + + + InterventionsFormViewModel - - - - - - - - TemporalAggregation + + + +study: Study + +router: GoRouter + +interventionsArray: FormArray<dynamic> + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> + +form: FormGroup + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +interventionsRequired: dynamic + +titles: Map<FormMode, String> + +canTestStudySchedule: bool - - - - - - - - IconData + + + +void setControlsFrom() + +InterventionsFormData buildFormData() + +void read() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +InterventionFormViewModel provide() + +void onCancel() + +dynamic onSave() + +dynamic testStudySchedule() - - - - - + + + + + - - - ImprovementDirectionFormatted + + + StudyScheduleControls - - - -_value: ImprovementDirection - <static>+values: List<ImprovementDirectionFormatted> - +value: ImprovementDirection - +string: String - +icon: IconData? - +hashCode: int + + + <static>+defaultScheduleType: PhaseSequence + <static>+defaultScheduleTypeSequence: String + <static>+defaultNumCycles: int + <static>+defaultPeriodLength: int + +sequenceTypeControl: FormControl<PhaseSequence> + +sequenceTypeCustomControl: FormControl<String> + +phaseDurationControl: FormControl<int> + +numCyclesControl: FormControl<int> + +includeBaselineControl: FormControl<bool> + +studyScheduleControls: Map<String, FormControl<Object>> + <static>+kNumCyclesMin: int + <static>+kNumCyclesMax: int + <static>+kPhaseDurationMin: int + <static>+kPhaseDurationMax: int + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +numCyclesRange: dynamic + +phaseDurationRange: dynamic + +customSequenceRequired: dynamic - - - +bool ==() - +String toString() - +String toJson() - <static>+ImprovementDirectionFormatted fromJson() + + + +void setStudyScheduleControlsFrom() + +StudyScheduleFormData buildStudyScheduleFormData() + +bool isSequencingCustom() - - - + + + - - - ImprovementDirection + + + PhaseSequence - - - - + + + + - - - ReportSectionType + + + StudyDesignInterventionsFormView - - - +index: int - <static>+values: List<ReportSectionType> - <static>+average: ReportSectionType - <static>+linearRegression: ReportSectionType + + + +Widget build() - - - - - - - - - DataReferenceIdentifier - - + + + + + - - - +hashCode: int + + + InterventionFormViewModel - - - +bool ==() + + + +study: Study + +interventionIdControl: FormControl<String> + +interventionTitleControl: FormControl<String> + +interventionIconControl: FormControl<IconOption> + +interventionDescriptionControl: FormControl<String> + +interventionTasksArray: FormArray<dynamic> + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> + +form: FormGroup + +interventionId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneTask: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - - - - - - DataReference + + + +void setControlsFrom() + +InterventionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +void onCancel() + +dynamic onSave() + +InterventionTaskFormViewModel provide() + +InterventionTaskFormRouteArgs buildNewFormRouteArgs() + +InterventionTaskFormRouteArgs buildFormRouteArgs() + +InterventionFormViewModel createDuplicate() - - - - - + + + + + - - - DataReferenceEditor + + + StudyScheduleFormView - - - +formControl: FormControl<DataReferenceIdentifier<T>> - +availableTasks: List<Task> - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + + + +formViewModel: StudyScheduleControls - - - +FormTableRow buildFormTableRow() - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + + + -FormTableRow _renderCustomSequence() + +Widget build() - - - + + + + + - - - ReactiveDropdownField + + + StudyScheduleFormData - - - - - - + + + +sequenceType: PhaseSequence + +sequenceTypeCustom: String + +numCycles: int + +phaseDuration: int + +includeBaseline: bool + +id: String + + - - - AverageSectionFormView + + + +StudySchedule toStudySchedule() + +Study apply() + +StudyScheduleFormData copy() - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + + + + + + + InterventionFormView - - - +Widget build() + + + +formViewModel: InterventionFormViewModel - - - - - + + + + + - - - LinearRegressionSectionFormView + + + InterventionTaskFormData - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + +taskId: String + +taskTitle: String + +taskDescription: String? + <static>+kDefaultTitle: String + +id: String - - - +Widget build() + + + +CheckmarkTask toTask() + +InterventionTaskFormData copy() - - - - - + + + + + - - - ReportItemFormData + + + InterventionPreview - - - +isPrimary: bool - +section: ReportSection - +id: String + + + +routeArgs: InterventionFormRouteArgs - - - <static>+dynamic fromDomainModel() - +ReportItemFormData copy() + + + +Widget build() - - - + + + - - - ReportSection + + + InterventionFormRouteArgs - - - - - + + + + - - - ReportsFormData + + + InterventionTaskFormView - - - +reportItems: List<ReportItemFormData> - +id: String + + + +formViewModel: InterventionTaskFormViewModel - - - +Study apply() - +ReportsFormData copy() + + + + + + + + + + InterventionTaskFormViewModel - - - - - - - - - ReportStatus + + + +taskIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +taskTitleControl: FormControl<String> + +taskDescriptionControl: FormControl<String> + +markAsCompletedControl: FormControl<bool> + +form: FormGroup + +taskId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +titles: Map<FormMode, String> - - - +index: int - <static>+values: List<ReportStatus> - <static>+primary: ReportStatus - <static>+secondary: ReportStatus + + + +void setControlsFrom() + +InterventionTaskFormData buildFormData() + +InterventionTaskFormViewModel createDuplicate() - - - - - + + + + + - - - ReportBadge + + + InterventionsFormData - - - +status: ReportStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + +interventionsData: List<InterventionFormData> + +studyScheduleData: StudyScheduleFormData + +id: String - - - +Widget build() + + + +Study apply() + +InterventionsFormData copy() - - - + + + + + - - - BadgeType + + + InterventionFormData + + + + + + +interventionId: String + +title: String + +description: String? + +tasksData: List<InterventionTaskFormData>? + +iconName: String? + <static>+kDefaultTitle: String + +id: String + + + + + + +Intervention toIntervention() + +InterventionFormData copy() diff --git a/docs/uml/designer_v2/lib/features/forms/uml.svg b/docs/uml/designer_v2/lib/features/forms/uml.svg index 1e0a34df9..82e6d2cab 100644 --- a/docs/uml/designer_v2/lib/features/forms/uml.svg +++ b/docs/uml/designer_v2/lib/features/forms/uml.svg @@ -1,97 +1,5 @@ - - [<abstract>FormValidationSetEnum - ] - - [FormControlValidation - | - +control: AbstractControl<dynamic>; - +validators: List<Validator<dynamic>>; - +asyncValidators: List<AsyncValidator<dynamic>>?; - +validationMessages: Map<String, String Function(Object)> - | - +FormControlValidation merge() - ] - - [FormControlValidation]o-[<abstract>AbstractControl] - - [<abstract>ManagedFormViewModel - | - +ManagedFormViewModel<T> createDuplicate() - ] - - [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] - - [FormViewModelNotFoundException - ] - - [Exception]<:--[FormViewModelNotFoundException] - - [FormViewModelCollection - | - +formViewModels: List<T>; - +formArray: FormArray<dynamic>; - +stagedViewModels: List<T>; - +retrievableViewModels: List<T>; - +formData: List<D> - | - +void add(); - +T remove(); - +T? findWhere(); - +T? removeWhere(); - +bool contains(); - +void stage(); - +T commit(); - +void reset(); - +void read() - ] - - [FormViewModelCollection]o-[FormArray] - - [FormArrayTable - | - +control: AbstractControl<dynamic>; - +items: List<T>; - +onSelectItem: void Function(T); - +getActionsAt: List<ModelAction<dynamic>> Function(T, int); - +onNewItem: void Function()?; - +rowTitle: String Function(T); - +onNewItemLabel: String; - +sectionTitle: String?; - +sectionDescription: String?; - +emptyIcon: IconData?; - +emptyTitle: String?; - +emptyDescription: String?; - +sectionTitleDivider: bool?; - +rowPrefix: Widget Function(BuildContext, T, int)?; - +rowSuffix: Widget Function(BuildContext, T, int)?; - +leadingWidget: Widget?; - +itemsSectionPadding: EdgeInsets?; - +hideLeadingTrailingWhenEmpty: bool; - <static>+columns: List<StandardTableColumn> - | - +Widget build(); - -List<Widget> _buildRow(); - -Widget _newItemButton() - ] - - [FormArrayTable]o-[<abstract>AbstractControl] - [FormArrayTable]o-[void Function(T)] - [FormArrayTable]o-[List<ModelAction<dynamic>> Function(T, int)] - [FormArrayTable]o-[void Function()?] - [FormArrayTable]o-[String Function(T)] - [FormArrayTable]o-[IconData] - [FormArrayTable]o-[Widget Function(BuildContext, T, int)?] - [FormArrayTable]o-[<abstract>Widget] - [FormArrayTable]o-[EdgeInsets] - - [<abstract>IFormData - | - +id: String - | - +IFormData copy() - ] - - [CustomFormControl + + [CustomFormControl | -_onValueChangedDebouncer: Debouncer?; -_onStatusChangedDebouncer: Debouncer?; @@ -205,210 +113,428 @@ [FormMode]o-[FormMode] [Enum]<:--[FormMode] + [<abstract>ManagedFormViewModel + | + +ManagedFormViewModel<T> createDuplicate() + ] + + [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] + + [FormViewModelNotFoundException + ] + + [Exception]<:--[FormViewModelNotFoundException] + + [FormViewModelCollection + | + +formViewModels: List<T>; + +formArray: FormArray<dynamic>; + +stagedViewModels: List<T>; + +retrievableViewModels: List<T>; + +formData: List<D> + | + +void add(); + +T remove(); + +T? findWhere(); + +T? removeWhere(); + +bool contains(); + +void stage(); + +T commit(); + +void reset(); + +void read() + ] + + [FormViewModelCollection]o-[FormArray] + [UnsavedChangesDialog | +Widget build() ] + [<abstract>IFormData + | + +id: String + | + +IFormData copy() + ] + + [FormArrayTable + | + +control: AbstractControl<dynamic>; + +items: List<T>; + +onSelectItem: void Function(T); + +getActionsAt: List<ModelAction<dynamic>> Function(T, int); + +onNewItem: void Function()?; + +rowTitle: String Function(T); + +onNewItemLabel: String; + +sectionTitle: String?; + +sectionDescription: String?; + +emptyIcon: IconData?; + +emptyTitle: String?; + +emptyDescription: String?; + +sectionTitleDivider: bool?; + +rowPrefix: Widget Function(BuildContext, T, int)?; + +rowSuffix: Widget Function(BuildContext, T, int)?; + +leadingWidget: Widget?; + +itemsSectionPadding: EdgeInsets?; + +hideLeadingTrailingWhenEmpty: bool; + <static>+columns: List<StandardTableColumn> + | + +Widget build(); + -List<Widget> _buildRow(); + -Widget _newItemButton() + ] + + [FormArrayTable]o-[<abstract>AbstractControl] + [FormArrayTable]o-[void Function(T)] + [FormArrayTable]o-[List<ModelAction<dynamic>> Function(T, int)] + [FormArrayTable]o-[void Function()?] + [FormArrayTable]o-[String Function(T)] + [FormArrayTable]o-[IconData] + [FormArrayTable]o-[Widget Function(BuildContext, T, int)?] + [FormArrayTable]o-[<abstract>Widget] + [FormArrayTable]o-[EdgeInsets] + + [<abstract>FormValidationSetEnum + ] + + [FormControlValidation + | + +control: AbstractControl<dynamic>; + +validators: List<Validator<dynamic>>; + +asyncValidators: List<AsyncValidator<dynamic>>?; + +validationMessages: Map<String, String Function(Object)> + | + +FormControlValidation merge() + ] + + [FormControlValidation]o-[<abstract>AbstractControl] + - + - - - - - - - - - - - - + + - + - + - + - + - + - - - + + + + - - - + + + - + + - + - + + + - + - + - + - + - + - + - + - + - + - - - + + - + + - + - - - + - + + + - + - - + + - + - - - + - + - + - + - + - + - + - + - + - + - - + + + - - + - + - - + + + - - - - - - - - FormValidationSetEnum - - - + + + - - - - - + + + + + + + + + - - - FormControlValidation + + + CustomFormControl - - - +control: AbstractControl<dynamic> - +validators: List<Validator<dynamic>> - +asyncValidators: List<AsyncValidator<dynamic>>? - +validationMessages: Map<String, String Function(Object)> + + + -_onValueChangedDebouncer: Debouncer? + -_onStatusChangedDebouncer: Debouncer? + +onValueChanged: void Function(T?)? + +onStatusChanged: void Function(ControlStatus)? + +onStatusChangedDebounceTime: int? + +onValueChangedDebounceTime: int? - - - +FormControlValidation merge() + + + +void dispose() - - - + + + - - - AbstractControl + + + Debouncer - - - - + + + - - - ManagedFormViewModel + + + void Function(T?)? - - - +ManagedFormViewModel<T> createDuplicate() + + + + + + + + void Function(ControlStatus)? - + + + + + + + FormControl + + + + + + + + + + + FormInvalidException + + + + + + + + + + + Exception + + + + + + + + + + + + FormConfigException + + + + + + +message: String? + + + + + + + + + + + + IFormViewModelDelegate + + + + + + +dynamic onSave() + +void onCancel() + + + + + + + + + + + + IFormGroupController + + + + + + +form: FormGroup + + + + + + + + + + + FormGroup + + + + + + + + + + + + FormControlOption + + + + + + +value: T + +label: String + +description: String? + +props: List<Object?> + + + + + + + + + + + Equatable + + + + + - - - + + + - + FormViewModel - + -_formData: T? -_formMode: FormMode @@ -433,7 +559,7 @@ - + -dynamic _setFormData() -dynamic _rememberDefaultControlValidators() @@ -457,41 +583,103 @@ - - - + + + + - - - FormViewModelNotFoundException + + + FormMode + + + + + + +index: int + <static>+values: List<FormMode> + <static>+create: FormMode + <static>+readonly: FormMode + <static>+edit: FormMode - - - + + + - - - Exception + + + FormValidationSetEnum + + + + + + + + + + + CancelableOperation + + + + + + + + + + + Enum + + + + + + + + + + + + ManagedFormViewModel + + + + + + +ManagedFormViewModel<T> createDuplicate() + + + + + + + + + + + FormViewModelNotFoundException - - - + + + - + FormViewModelCollection - + +formViewModels: List<T> +formArray: FormArray<dynamic> @@ -501,7 +689,7 @@ - + +void add() +T remove() @@ -518,28 +706,71 @@ - + - + FormArray + + + + + + + + UnsavedChangesDialog + + + + + + +Widget build() + + + + + + + + + + + + + IFormData + + + + + + +id: String + + + + + + +IFormData copy() + + + + - - - + + + - + FormArrayTable - + +control: AbstractControl<dynamic> +items: List<T> @@ -563,7 +794,7 @@ - + +Widget build() -List<Widget> _buildRow() @@ -572,11 +803,22 @@ + + + + + + + AbstractControl + + + + - + - + void Function(T) @@ -585,9 +827,9 @@ - + - + List<ModelAction<dynamic>> Function(T, int) @@ -596,9 +838,9 @@ - + - + void Function()? @@ -607,9 +849,9 @@ - + - + String Function(T) @@ -618,9 +860,9 @@ - + - + IconData @@ -629,9 +871,9 @@ - + - + Widget Function(BuildContext, T, int)? @@ -640,9 +882,9 @@ - + - + Widget @@ -651,281 +893,39 @@ - + - + EdgeInsets - - - - - - - - - IFormData - - - - - - +id: String - - - - - - +IFormData copy() - - - - - - - - - - - - - CustomFormControl - - - - - - -_onValueChangedDebouncer: Debouncer? - -_onStatusChangedDebouncer: Debouncer? - +onValueChanged: void Function(T?)? - +onStatusChanged: void Function(ControlStatus)? - +onStatusChangedDebounceTime: int? - +onValueChangedDebounceTime: int? - - - - - - +void dispose() - - - - - - - - - - - Debouncer - - - - - - - - - - - void Function(T?)? - - - - - - - - - - - void Function(ControlStatus)? - - - - - - - - - - - FormControl - - - - - - - - - - - FormInvalidException - - - - - - - - - - - - FormConfigException - - - - - - +message: String? - - - - - - - - - - - - IFormViewModelDelegate - - - - - - +dynamic onSave() - +void onCancel() - - - - - - - - - - - - IFormGroupController - - - - - - +form: FormGroup - - - - - - - - - - - FormGroup - - - - - - - - - - - - FormControlOption - - - - - - +value: T - +label: String - +description: String? - +props: List<Object?> - - - - - - - - - - - Equatable - - - - - - - - - - - - FormMode - - - - - - +index: int - <static>+values: List<FormMode> - <static>+create: FormMode - <static>+readonly: FormMode - <static>+edit: FormMode - - - - - - - - - - - CancelableOperation - - - - - - - + + + + + - - - Enum + + + FormControlValidation - - - - - - - - - UnsavedChangesDialog + + + +control: AbstractControl<dynamic> + +validators: List<Validator<dynamic>> + +asyncValidators: List<AsyncValidator<dynamic>>? + +validationMessages: Map<String, String Function(Object)> - - - +Widget build() + + + +FormControlValidation merge() diff --git a/docs/uml/designer_v2/lib/features/recruit/uml.svg b/docs/uml/designer_v2/lib/features/recruit/uml.svg index 320b76562..faed1ffd7 100644 --- a/docs/uml/designer_v2/lib/features/recruit/uml.svg +++ b/docs/uml/designer_v2/lib/features/recruit/uml.svg @@ -1,44 +1,5 @@ - - [InviteCodeFormView - | - +formViewModel: InviteCodeFormViewModel - | - +Widget build(); - -List<FormTableRow> _conditionalInterventionRows() - ] - - [InviteCodeFormView]o-[InviteCodeFormViewModel] - [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] - - [StudyRecruitScreen - | - +Widget build(); - -Widget _inviteCodesSectionHeader(); - -Widget _newInviteCodeButton(); - -dynamic _onSelectInvite() - ] - - [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] - - [StudyRecruitController - | - +inviteCodeRepository: IInviteCodeRepository; - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - | - -dynamic _subscribeInvites(); - +Intervention? getIntervention(); - +int getParticipantCountForInvite(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void dispose() - ] - - [StudyRecruitController]o-[<abstract>IInviteCodeRepository] - [StudyRecruitController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyRecruitController] - [<abstract>IModelActionProvider]<:--[StudyRecruitController] - - [InviteCodeFormViewModel + + [InviteCodeFormViewModel | +study: Study; +inviteCodeRepository: IInviteCodeRepository; @@ -77,6 +38,45 @@ +Widget build() ] + [InviteCodeFormView + | + +formViewModel: InviteCodeFormViewModel + | + +Widget build(); + -List<FormTableRow> _conditionalInterventionRows() + ] + + [InviteCodeFormView]o-[InviteCodeFormViewModel] + [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] + + [StudyRecruitScreen + | + +Widget build(); + -Widget _inviteCodesSectionHeader(); + -Widget _newInviteCodeButton(); + -dynamic _onSelectInvite() + ] + + [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] + + [StudyRecruitController + | + +inviteCodeRepository: IInviteCodeRepository; + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + | + -dynamic _subscribeInvites(); + +Intervention? getIntervention(); + +int getParticipantCountForInvite(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void dispose() + ] + + [StudyRecruitController]o-[<abstract>IInviteCodeRepository] + [StudyRecruitController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyRecruitController] + [<abstract>IModelActionProvider]<:--[StudyRecruitController] + [StudyInvitesTable | +invites: List<StudyInvite>; @@ -99,105 +99,79 @@ - + - + - + - - - - - + - + - + - - - - - - + - - + - + - + + + - + - + + + + + - + - + - + - - - - - + + + + - + + - + - + - + - + - + - - - - - - - - - InviteCodeFormView - - - - - - +formViewModel: InviteCodeFormViewModel - - - - - - +Widget build() - -List<FormTableRow> _conditionalInterventionRows() - - - + + + - - - + + + - + InviteCodeFormViewModel - + +study: Study +inviteCodeRepository: IInviteCodeRepository @@ -216,7 +190,7 @@ - + +void initControls() -dynamic _uniqueInviteCode() @@ -229,11 +203,117 @@ + + + + + + + Study + + + + + + + + + + + IInviteCodeRepository + + + + + + + + + + + FormControl + + + + + + + + + + + FormGroup + + + + + + + + + + + FormViewModel + + + + + + + + + + + + + EnrolledBadge + + + + + + +enrolledCount: int + + + + + + +Widget build() + + + + + + + + + + + + + InviteCodeFormView + + + + + + +formViewModel: InviteCodeFormViewModel + + + + + + +Widget build() + -List<FormTableRow> _conditionalInterventionRows() + + + + - + - + FormConsumerWidget @@ -242,16 +322,16 @@ - - + + - + StudyRecruitScreen - + +Widget build() -Widget _inviteCodesSectionHeader() @@ -263,9 +343,9 @@ - + - + StudyPageWidget @@ -274,24 +354,24 @@ - - - + + + - + StudyRecruitController - + +inviteCodeRepository: IInviteCodeRepository -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - + -dynamic _subscribeInvites() +Intervention? getIntervention() @@ -303,22 +383,11 @@ - - - - - - - IInviteCodeRepository - - - - - + - + StreamSubscription @@ -327,9 +396,9 @@ - + - + StudyBaseController @@ -338,97 +407,28 @@ - + - + IModelActionProvider - - - - - - - Study - - - - - - - - - - - FormControl - - - - - - - - - - - FormGroup - - - - - - - - - - - FormViewModel - - - - - - - - - - - - - EnrolledBadge - - - - - - +enrolledCount: int - - - - - - +Widget build() - - - - - - - + + + - + StudyInvitesTable - + +invites: List<StudyInvite> +onSelect: void Function(StudyInvite) @@ -439,7 +439,7 @@ - + +Widget build() -List<Widget> _buildRow() @@ -449,9 +449,9 @@ - + - + void Function(StudyInvite) @@ -460,9 +460,9 @@ - + - + List<ModelAction<dynamic>> Function(StudyInvite) @@ -471,9 +471,9 @@ - + - + Intervention? Function(String) @@ -482,9 +482,9 @@ - + - + int Function(StudyInvite) diff --git a/docs/uml/designer_v2/lib/features/study/uml.svg b/docs/uml/designer_v2/lib/features/study/uml.svg index f06cdfa0d..b9c58a8cc 100644 --- a/docs/uml/designer_v2/lib/features/study/uml.svg +++ b/docs/uml/designer_v2/lib/features/study/uml.svg @@ -1,96 +1,5 @@ - - [StudyBaseController - | - +studyId: String; - +studyRepository: IStudyRepository; - +router: GoRouter; - +studySubscription: StreamSubscription<WrappedModel<Study>>? - | - +dynamic subscribeStudy(); - +dynamic onStudySubscriptionUpdate(); - +dynamic onStudySubscriptionError(); - +void dispose() - ] - - [StudyBaseController]o-[<abstract>IStudyRepository] - [StudyBaseController]o-[GoRouter] - [StudyBaseController]o-[StreamSubscription] - - [StudyParticipationBadge - | - +participation: Participation; - +type: BadgeType; - +showPrefixIcon: bool - | - +Widget build() - ] - - [StudyParticipationBadge]o-[Participation] - [StudyParticipationBadge]o-[BadgeType] - - [RouteInformation - | - +route: String?; - +extra: String?; - +cmd: String?; - +data: String? - | - +String toString() - ] - - [<abstract>PlatformController - | - +studyId: String; - +baseSrc: String; - +previewSrc: String; - +routeInformation: RouteInformation; - +frameWidget: Widget - | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void listen(); - +void send(); - +void openNewPage() - ] - - [<abstract>PlatformController]o-[RouteInformation] - [<abstract>PlatformController]o-[<abstract>Widget] - - [WebController - | - +iFrameElement: IFrameElement - | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void openNewPage(); - +void listen(); - +void send() - ] - - [WebController]o-[IFrameElement] - [<abstract>PlatformController]<:-[WebController] - - [MobileController - | - +void openNewPage(); - +void refresh(); - +void registerViews(); - +void listen(); - +void send(); - +void navigate(); - +void activate(); - +void generateUrl() - ] - - [<abstract>PlatformController]<:-[MobileController] - - [<abstract>IStudyAppBarViewModel + + [<abstract>IStudyAppBarViewModel | +isSyncIndicatorVisible: bool; +isStatusBadgeVisible: bool; @@ -122,25 +31,36 @@ [StudyScaffold]o-[<abstract>Widget] [StudyScaffold]o-[SingleColumnLayoutType] - [StudyController + [PreviewFrame | - +notificationService: INotificationService; - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; - +studyActions: List<ModelAction<dynamic>> + +studyId: String; + +routeArgs: StudyFormRouteArgs?; + +route: String? + ] + + [PreviewFrame]o-[<abstract>StudyFormRouteArgs] + + [StudyParticipationBadge | - +dynamic syncStudyStatus(); - +dynamic onStudySubscriptionUpdate(); - -dynamic _redirectNewToActualStudyID(); - +dynamic publishStudy(); - +void onChangeStudyParticipation(); - +void onAddParticipants(); - +void onSettingsPressed(); - +void dispose() + +participation: Participation; + +type: BadgeType; + +showPrefixIcon: bool + | + +Widget build() ] - [StudyController]o-[<abstract>INotificationService] - [StudyController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyController] + [StudyParticipationBadge]o-[Participation] + [StudyParticipationBadge]o-[BadgeType] + + [<abstract>StudyPageWidget + | + +studyId: String + | + +Widget? banner() + ] + + [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] + [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] [<abstract>IStudyStatusBadgeViewModel | @@ -166,25 +86,31 @@ [StudyStatusBadge]o-[StudyStatus] [StudyStatusBadge]o-[BadgeType] - [StudyTestController + [FrameControlsWidget | - +authRepository: IAuthRepository; - +languageCode: String + +onRefresh: void Function()?; + +onOpenNewTab: void Function()?; + +enabled: bool + | + +Widget build() ] - [StudyTestController]o-[<abstract>IAuthRepository] - [StudyBaseController]<:-[StudyTestController] + [FrameControlsWidget]o-[void Function()?] + [<abstract>ConsumerWidget]<:-[FrameControlsWidget] - [TestAppRoutes + [StudyTestScreen | - <static>+studyOverview: String; - <static>+eligibility: String; - <static>+intervention: String; - <static>+consent: String; - <static>+journey: String; - <static>+dashboard: String + +previewRoute: String? + | + +Widget build(); + +Widget? banner(); + +dynamic load(); + +dynamic save(); + +dynamic showHelp() ] + [<abstract>StudyPageWidget]<:-[StudyTestScreen] + [<abstract>IStudyNavViewModel | +isEditTabEnabled: bool; @@ -215,12 +141,67 @@ <static>+dynamic reports() ] - [StudySettingsDialog + [RouteInformation | - +Widget build() + +route: String?; + +extra: String?; + +cmd: String?; + +data: String? + | + +String toString() ] - [<abstract>StudyPageWidget]<:-[StudySettingsDialog] + [<abstract>PlatformController + | + +studyId: String; + +baseSrc: String; + +previewSrc: String; + +routeInformation: RouteInformation; + +frameWidget: Widget + | + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void listen(); + +void send(); + +void openNewPage() + ] + + [<abstract>PlatformController]o-[RouteInformation] + [<abstract>PlatformController]o-[<abstract>Widget] + + [WebController + | + +iFrameElement: IFrameElement + | + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void openNewPage(); + +void listen(); + +void send() + ] + + [WebController]o-[IFrameElement] + [<abstract>PlatformController]<:-[WebController] + + [MobileController + | + +void openNewPage(); + +void refresh(); + +void registerViews(); + +void listen(); + +void send(); + +void navigate(); + +void activate(); + +void generateUrl() + ] + + [<abstract>PlatformController]<:-[MobileController] [StudySettingsFormViewModel | @@ -246,49 +227,29 @@ [StudySettingsFormViewModel]o-[FormGroup] [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] - [<abstract>StudyPageWidget - | - +studyId: String - | - +Widget? banner() - ] - - [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] - [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] - - [StudyTestScreen - | - +previewRoute: String? - | - +Widget build(); - +Widget? banner(); - +dynamic load(); - +dynamic save(); - +dynamic showHelp() - ] - - [<abstract>StudyPageWidget]<:-[StudyTestScreen] - - [FrameControlsWidget - | - +onRefresh: void Function()?; - +onOpenNewTab: void Function()?; - +enabled: bool + [StudySettingsDialog | +Widget build() ] - [FrameControlsWidget]o-[void Function()?] - [<abstract>ConsumerWidget]<:-[FrameControlsWidget] + [<abstract>StudyPageWidget]<:-[StudySettingsDialog] - [PreviewFrame + [StudyBaseController | +studyId: String; - +routeArgs: StudyFormRouteArgs?; - +route: String? + +studyRepository: IStudyRepository; + +router: GoRouter; + +studySubscription: StreamSubscription<WrappedModel<Study>>? + | + +dynamic subscribeStudy(); + +dynamic onStudySubscriptionUpdate(); + +dynamic onStudySubscriptionError(); + +void dispose() ] - [PreviewFrame]o-[<abstract>StudyFormRouteArgs] + [StudyBaseController]o-[<abstract>IStudyRepository] + [StudyBaseController]o-[GoRouter] + [StudyBaseController]o-[StreamSubscription] [WebFrame | @@ -331,424 +292,207 @@ +Widget build() ] + [StudyTestController + | + +authRepository: IAuthRepository; + +languageCode: String + ] + + [StudyTestController]o-[<abstract>IAuthRepository] + [StudyBaseController]<:-[StudyTestController] + + [StudyController + | + +notificationService: INotificationService; + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; + +studyActions: List<ModelAction<dynamic>> + | + +dynamic syncStudyStatus(); + +dynamic onStudySubscriptionUpdate(); + -dynamic _redirectNewToActualStudyID(); + +dynamic publishStudy(); + +void onChangeStudyParticipation(); + +void onAddParticipants(); + +void onSettingsPressed(); + +void dispose() + ] + + [StudyController]o-[<abstract>INotificationService] + [StudyController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyController] + + [TestAppRoutes + | + <static>+studyOverview: String; + <static>+eligibility: String; + <static>+intervention: String; + <static>+consent: String; + <static>+journey: String; + <static>+dashboard: String + ] + - + - - - - + + + - - - + + + - + + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - + - - + - + - - - + + + + - + + - + - + - + - + - + - + - + - - - + - + - + - + - + + + + + - + - + - + - + - + - + + + + + - + - - - - - + - + - + - + - + - + - + + + + + - - - - - - - - + - - - - + - + - - - + - + - + - + - + - - - - - - - - - - - StudyBaseController - - - - - - +studyId: String - +studyRepository: IStudyRepository - +router: GoRouter - +studySubscription: StreamSubscription<WrappedModel<Study>>? - - - - - - +dynamic subscribeStudy() - +dynamic onStudySubscriptionUpdate() - +dynamic onStudySubscriptionError() - +void dispose() - - - + - - - - - - - IStudyRepository - - - - - - - - - - - GoRouter - - - - - - - - - - - StreamSubscription - - - - - - - - - - - - - StudyParticipationBadge - - - - - - +participation: Participation - +type: BadgeType - +showPrefixIcon: bool - - - - - - +Widget build() - - - - - - - - - - - Participation - - - - - - - - - - - BadgeType - - - - - - - - - - - - - RouteInformation - - - - - - +route: String? - +extra: String? - +cmd: String? - +data: String? - - - - - - +String toString() - - - - - - - - - - - - - PlatformController - - - - - - +studyId: String - +baseSrc: String - +previewSrc: String - +routeInformation: RouteInformation - +frameWidget: Widget - - - - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void listen() - +void send() - +void openNewPage() - - - - - - - - - - - Widget - - - - - - - - - - - - - WebController - - - - - - +iFrameElement: IFrameElement - - - - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void openNewPage() - +void listen() - +void send() - - - - - - - - - - - IFrameElement - - - + + + - - - - - - - - MobileController - - - - - - +void openNewPage() - +void refresh() - +void registerViews() - +void listen() - +void send() - +void navigate() - +void activate() - +void generateUrl() - - - + + + + + + + + + + + - - + + - + IStudyAppBarViewModel - + +isSyncIndicatorVisible: bool +isStatusBadgeVisible: bool @@ -759,16 +503,16 @@ - - + + - + IStudyStatusBadgeViewModel - + +studyParticipation: Participation? +studyStatus: StudyStatus? @@ -778,16 +522,16 @@ - - + + - + IStudyNavViewModel - + +isEditTabEnabled: bool +isTestTabEnabled: bool @@ -801,16 +545,16 @@ - - + + - + StudyScaffold - + +studyId: String +tabs: List<NavbarTab>? @@ -831,9 +575,9 @@ - + - + NavbarTab @@ -842,90 +586,158 @@ - - - + + + - + StudyPageWidget - + +studyId: String - + +Widget? banner() + + + + + + + Widget + + + + - + - + SingleColumnLayoutType - - - - - + + + + - - - StudyController + + + PreviewFrame - - - +notificationService: INotificationService - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? - +studyActions: List<ModelAction<dynamic>> + + + +studyId: String + +routeArgs: StudyFormRouteArgs? + +route: String? - - - +dynamic syncStudyStatus() - +dynamic onStudySubscriptionUpdate() - -dynamic _redirectNewToActualStudyID() - +dynamic publishStudy() - +void onChangeStudyParticipation() - +void onAddParticipants() - +void onSettingsPressed() - +void dispose() + + + + + + + + StudyFormRouteArgs - - - + + + + + - - - INotificationService + + + StudyParticipationBadge + + + + + + +participation: Participation + +type: BadgeType + +showPrefixIcon: bool + + + + + + +Widget build() + + + + + + + + + + + Participation + + + + + + + + + + + BadgeType + + + + + + + + + + + ConsumerWidget + + + + + + + + + + + IWithBanner - + - + StudyStatus @@ -934,17 +746,17 @@ - - - + + + - + StudyStatusBadge - + +participation: Participation? +status: StudyStatus? @@ -954,143 +766,271 @@ - + +Widget build() - - - - + + + + + - - - StudyTestController + + + FrameControlsWidget - - - +authRepository: IAuthRepository - +languageCode: String + + + +onRefresh: void Function()? + +onOpenNewTab: void Function()? + +enabled: bool + + + + + + +Widget build() - - - + + + - - - IAuthRepository + + + void Function()? - - - - + + + + + - - - TestAppRoutes + + + StudyTestScreen - - - <static>+studyOverview: String - <static>+eligibility: String - <static>+intervention: String - <static>+consent: String - <static>+journey: String - <static>+dashboard: String + + + +previewRoute: String? + + + + + + +Widget build() + +Widget? banner() + +dynamic load() + +dynamic save() + +dynamic showHelp() + + + + + + + + + + + + StudyNav + + + + + + <static>+dynamic tabs() + <static>+dynamic edit() + <static>+dynamic test() + <static>+dynamic recruit() + <static>+dynamic monitor() + <static>+dynamic analyze() + + + + + + + + + + + + StudyDesignNav + + + + + + <static>+dynamic tabs() + <static>+dynamic info() + <static>+dynamic enrollment() + <static>+dynamic interventions() + <static>+dynamic measurements() + <static>+dynamic reports() + + + + + + + + + + + + + RouteInformation + + + + + + +route: String? + +extra: String? + +cmd: String? + +data: String? + + + + + + +String toString() + + + + + + + + + + + + + PlatformController + + + + + + +studyId: String + +baseSrc: String + +previewSrc: String + +routeInformation: RouteInformation + +frameWidget: Widget + + + + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void listen() + +void send() + +void openNewPage() - - - - + + + + + - - - StudyNav + + + WebController - - - <static>+dynamic tabs() - <static>+dynamic edit() - <static>+dynamic test() - <static>+dynamic recruit() - <static>+dynamic monitor() - <static>+dynamic analyze() + + + +iFrameElement: IFrameElement - - - - - - - - - StudyDesignNav + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void openNewPage() + +void listen() + +void send() - - - <static>+dynamic tabs() - <static>+dynamic info() - <static>+dynamic enrollment() - <static>+dynamic interventions() - <static>+dynamic measurements() - <static>+dynamic reports() + + + + + + + + IFrameElement - - - - + + + + - - - StudySettingsDialog + + + MobileController - - - +Widget build() + + + +void openNewPage() + +void refresh() + +void registerViews() + +void listen() + +void send() + +void navigate() + +void activate() + +void generateUrl() - - - + + + - + StudySettingsFormViewModel - + +study: AsyncValue<Study> +studyRepository: IStudyRepository @@ -1103,7 +1043,7 @@ - + +void setControlsFrom() +Study buildFormData() @@ -1116,20 +1056,31 @@ - + - + AsyncValue + + + + + + + IStudyRepository + + + + - + - + FormControl @@ -1138,9 +1089,9 @@ - + - + FormGroup @@ -1149,155 +1100,106 @@ - + - + FormViewModel - - - - - - - ConsumerWidget - - - - - - - - - - - IWithBanner - - - - - - - - - - - - - StudyTestScreen - - + + + + - - - +previewRoute: String? + + + StudySettingsDialog - - - +Widget build() - +Widget? banner() - +dynamic load() - +dynamic save() - +dynamic showHelp() + + + +Widget build() - - - - - - - - - FrameControlsWidget - - + + + + + - - - +onRefresh: void Function()? - +onOpenNewTab: void Function()? - +enabled: bool + + + StudyBaseController - - - +Widget build() + + + +studyId: String + +studyRepository: IStudyRepository + +router: GoRouter + +studySubscription: StreamSubscription<WrappedModel<Study>>? - - - - - - - - void Function()? + + + +dynamic subscribeStudy() + +dynamic onStudySubscriptionUpdate() + +dynamic onStudySubscriptionError() + +void dispose() - - - - - - - - PreviewFrame - - + + + - - - +studyId: String - +routeArgs: StudyFormRouteArgs? - +route: String? + + + GoRouter - - - + + + - - - StudyFormRouteArgs + + + StreamSubscription - - - + + + - + WebFrame - + +previewSrc: String +studyId: String - + +Widget build() @@ -1306,16 +1208,16 @@ - - + + - + DisabledFrame - + +Widget build() @@ -1324,17 +1226,17 @@ - - - + + + - + PhoneContainer - + <static>+defaultWidth: double <static>+defaultHeight: double @@ -1348,7 +1250,7 @@ - + +Widget build() @@ -1357,9 +1259,9 @@ - + - + Color @@ -1368,16 +1270,16 @@ - - + + - + MobileFrame - + +Widget build() @@ -1386,22 +1288,120 @@ - - + + - + DesktopFrame - + +Widget build() + + + + + + + + StudyTestController + + + + + + +authRepository: IAuthRepository + +languageCode: String + + + + + + + + + + + IAuthRepository + + + + + + + + + + + + + StudyController + + + + + + +notificationService: INotificationService + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? + +studyActions: List<ModelAction<dynamic>> + + + + + + +dynamic syncStudyStatus() + +dynamic onStudySubscriptionUpdate() + -dynamic _redirectNewToActualStudyID() + +dynamic publishStudy() + +void onChangeStudyParticipation() + +void onAddParticipants() + +void onSettingsPressed() + +void dispose() + + + + + + + + + + + INotificationService + + + + + + + + + + + + TestAppRoutes + + + + + + <static>+studyOverview: String + <static>+eligibility: String + <static>+intervention: String + <static>+consent: String + <static>+journey: String + <static>+dashboard: String + + + + diff --git a/docs/uml/designer_v2/lib/features/uml.svg b/docs/uml/designer_v2/lib/features/uml.svg index a38d2dddf..9147976a1 100644 --- a/docs/uml/designer_v2/lib/features/uml.svg +++ b/docs/uml/designer_v2/lib/features/uml.svg @@ -1,96 +1,127 @@ - - [<abstract>FormValidationSetEnum + + [DrawerEntry + | + +localizedTitle: String Function(); + +icon: IconData?; + +localizedHelpText: String Function()?; + +enabled: bool; + +onSelected: void Function(BuildContext, WidgetRef)?; + +title: String; + +helpText: String? + | + +void onClick() ] - [FormControlValidation + [DrawerEntry]o-[String Function()] + [DrawerEntry]o-[IconData] + [DrawerEntry]o-[String Function()?] + [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] + + [GoRouterDrawerEntry | - +control: AbstractControl<dynamic>; - +validators: List<Validator<dynamic>>; - +asyncValidators: List<AsyncValidator<dynamic>>?; - +validationMessages: Map<String, String Function(Object)> + +intent: RoutingIntent | - +FormControlValidation merge() + +void onClick() ] - [FormControlValidation]o-[<abstract>AbstractControl] + [GoRouterDrawerEntry]o-[RoutingIntent] + [DrawerEntry]<:-[GoRouterDrawerEntry] - [<abstract>ManagedFormViewModel + [AppDrawer | - +ManagedFormViewModel<T> createDuplicate() + +title: String; + +width: int; + +leftPaddingEntries: double; + +logoPaddingVertical: double; + +logoPaddingHorizontal: double; + +logoMaxHeight: double; + +logoSectionMinHeight: double; + +logoSectionMaxHeight: double ] - [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] - - [FormViewModelNotFoundException + [DashboardController + | + +studyRepository: IStudyRepository; + +authRepository: IAuthRepository; + +userRepository: IUserRepository; + +router: GoRouter; + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>?; + +searchController: SearchController + | + -dynamic _subscribeStudies(); + +dynamic setSearchText(); + +dynamic setStudiesFilter(); + +dynamic onSelectStudy(); + +dynamic onClickNewStudy(); + +dynamic pinStudy(); + +dynamic pinOffStudy(); + +void filterStudies(); + +void sortStudies(); + +bool isPinned(); + +List<ModelAction<dynamic>> availableActions(); + +void dispose() ] - [Exception]<:--[FormViewModelNotFoundException] + [DashboardController]o-[<abstract>IStudyRepository] + [DashboardController]o-[<abstract>IAuthRepository] + [DashboardController]o-[<abstract>IUserRepository] + [DashboardController]o-[GoRouter] + [DashboardController]o-[StreamSubscription] + [DashboardController]o-[SearchController] + [<abstract>IModelActionProvider]<:--[DashboardController] - [FormViewModelCollection + [StudiesTable | - +formViewModels: List<T>; - +formArray: FormArray<dynamic>; - +stagedViewModels: List<T>; - +retrievableViewModels: List<T>; - +formData: List<D> + +studies: List<Study>; + +onSelect: void Function(Study); + +getActions: List<ModelAction<dynamic>> Function(Study); + +emptyWidget: Widget; + +pinnedStudies: Iterable<String>; + +dashboardController: DashboardController; + +pinnedPredicates: int Function(Study, Study); + -_sortColumns: List<int Function(Study, Study)?> | - +void add(); - +T remove(); - +T? findWhere(); - +T? removeWhere(); - +bool contains(); - +void stage(); - +T commit(); - +void reset(); - +void read() + +Widget build(); + -List<Widget> _buildRow() ] - [FormViewModelCollection]o-[FormArray] + [StudiesTable]o-[void Function(Study)] + [StudiesTable]o-[List<ModelAction<dynamic>> Function(Study)] + [StudiesTable]o-[<abstract>Widget] + [StudiesTable]o-[DashboardController] + [StudiesTable]o-[int Function(Study, Study)] - [FormArrayTable + [DashboardScaffold | - +control: AbstractControl<dynamic>; - +items: List<T>; - +onSelectItem: void Function(T); - +getActionsAt: List<ModelAction<dynamic>> Function(T, int); - +onNewItem: void Function()?; - +rowTitle: String Function(T); - +onNewItemLabel: String; - +sectionTitle: String?; - +sectionDescription: String?; - +emptyIcon: IconData?; - +emptyTitle: String?; - +emptyDescription: String?; - +sectionTitleDivider: bool?; - +rowPrefix: Widget Function(BuildContext, T, int)?; - +rowSuffix: Widget Function(BuildContext, T, int)?; - +leadingWidget: Widget?; - +itemsSectionPadding: EdgeInsets?; - +hideLeadingTrailingWhenEmpty: bool; - <static>+columns: List<StandardTableColumn> + +body: Widget | - +Widget build(); - -List<Widget> _buildRow(); - -Widget _newItemButton() + +Widget build() ] - [FormArrayTable]o-[<abstract>AbstractControl] - [FormArrayTable]o-[void Function(T)] - [FormArrayTable]o-[List<ModelAction<dynamic>> Function(T, int)] - [FormArrayTable]o-[void Function()?] - [FormArrayTable]o-[String Function(T)] - [FormArrayTable]o-[IconData] - [FormArrayTable]o-[Widget Function(BuildContext, T, int)?] - [FormArrayTable]o-[<abstract>Widget] - [FormArrayTable]o-[EdgeInsets] + [DashboardScaffold]o-[<abstract>Widget] - [<abstract>IFormData + [StudiesFilter | - +id: String + +index: int; + <static>+values: List<StudiesFilter> + ] + + [Enum]<:--[StudiesFilter] + + [DashboardScreen | - +IFormData copy() + +filter: StudiesFilter? + ] + + [DashboardScreen]o-[StudiesFilter] + + [StudyMonitorScreen + | + +Widget build() ] + [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] + [CustomFormControl | -_onValueChangedDebouncer: Debouncer?; @@ -205,111 +236,244 @@ [FormMode]o-[FormMode] [Enum]<:--[FormMode] - [UnsavedChangesDialog - | - +Widget build() - ] - - [DrawerEntry - | - +localizedTitle: String Function(); - +icon: IconData?; - +localizedHelpText: String Function()?; - +enabled: bool; - +onSelected: void Function(BuildContext, WidgetRef)?; - +title: String; - +helpText: String? + [<abstract>ManagedFormViewModel | - +void onClick() + +ManagedFormViewModel<T> createDuplicate() ] - [DrawerEntry]o-[String Function()] - [DrawerEntry]o-[IconData] - [DrawerEntry]o-[String Function()?] - [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] + [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] - [GoRouterDrawerEntry - | - +intent: RoutingIntent - | - +void onClick() + [FormViewModelNotFoundException ] - [GoRouterDrawerEntry]o-[RoutingIntent] - [DrawerEntry]<:-[GoRouterDrawerEntry] + [Exception]<:--[FormViewModelNotFoundException] - [AppDrawer + [FormViewModelCollection | - +title: String; - +width: int; - +leftPaddingEntries: double; - +logoPaddingVertical: double; - +logoPaddingHorizontal: double; - +logoMaxHeight: double; - +logoSectionMinHeight: double; - +logoSectionMaxHeight: double - ] - - [AuthScaffold + +formViewModels: List<T>; + +formArray: FormArray<dynamic>; + +stagedViewModels: List<T>; + +retrievableViewModels: List<T>; + +formData: List<D> | - +body: Widget; - +formKey: AuthFormKey; - +leftContentMinWidth: double; - +leftPanelMinWidth: double; - +leftPanelPadding: EdgeInsets + +void add(); + +T remove(); + +T? findWhere(); + +T? removeWhere(); + +bool contains(); + +void stage(); + +T commit(); + +void reset(); + +void read() ] - [AuthScaffold]o-[<abstract>Widget] - [AuthScaffold]o-[AuthFormKey] - [AuthScaffold]o-[EdgeInsets] + [FormViewModelCollection]o-[FormArray] - [PasswordRecoveryForm - | - +formKey: AuthFormKey + [UnsavedChangesDialog | +Widget build() ] - [PasswordRecoveryForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] - - [LoginForm + [<abstract>IFormData | - +formKey: AuthFormKey + +id: String | - +Widget build() + +IFormData copy() ] - [LoginForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[LoginForm] - - [SignupForm + [FormArrayTable | - +formKey: AuthFormKey + +control: AbstractControl<dynamic>; + +items: List<T>; + +onSelectItem: void Function(T); + +getActionsAt: List<ModelAction<dynamic>> Function(T, int); + +onNewItem: void Function()?; + +rowTitle: String Function(T); + +onNewItemLabel: String; + +sectionTitle: String?; + +sectionDescription: String?; + +emptyIcon: IconData?; + +emptyTitle: String?; + +emptyDescription: String?; + +sectionTitleDivider: bool?; + +rowPrefix: Widget Function(BuildContext, T, int)?; + +rowSuffix: Widget Function(BuildContext, T, int)?; + +leadingWidget: Widget?; + +itemsSectionPadding: EdgeInsets?; + +hideLeadingTrailingWhenEmpty: bool; + <static>+columns: List<StandardTableColumn> | +Widget build(); - -dynamic _onClickTermsOfUse(); - -dynamic _onClickPrivacyPolicy() + -List<Widget> _buildRow(); + -Widget _newItemButton() ] - [SignupForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[SignupForm] - - [PasswordForgotForm - | - +formKey: AuthFormKey - | + [FormArrayTable]o-[<abstract>AbstractControl] + [FormArrayTable]o-[void Function(T)] + [FormArrayTable]o-[List<ModelAction<dynamic>> Function(T, int)] + [FormArrayTable]o-[void Function()?] + [FormArrayTable]o-[String Function(T)] + [FormArrayTable]o-[IconData] + [FormArrayTable]o-[Widget Function(BuildContext, T, int)?] + [FormArrayTable]o-[<abstract>Widget] + [FormArrayTable]o-[EdgeInsets] + + [<abstract>FormValidationSetEnum + ] + + [FormControlValidation + | + +control: AbstractControl<dynamic>; + +validators: List<Validator<dynamic>>; + +asyncValidators: List<AsyncValidator<dynamic>>?; + +validationMessages: Map<String, String Function(Object)> + | + +FormControlValidation merge() + ] + + [FormControlValidation]o-[<abstract>AbstractControl] + + [InviteCodeFormViewModel + | + +study: Study; + +inviteCodeRepository: IInviteCodeRepository; + +codeControl: FormControl<String>; + +codeControlValidationMessages: Map<String, String Function(dynamic)>; + +isPreconfiguredScheduleControl: FormControl<bool>; + +preconfiguredScheduleTypeControl: FormControl<PhaseSequence>; + +interventionAControl: FormControl<String>; + +interventionBControl: FormControl<String>; + +form: FormGroup; + +titles: Map<FormMode, String>; + +interventionControlOptions: List<FormControlOption<String>>; + +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; + +isPreconfiguredSchedule: bool; + +preconfiguredSchedule: List<String>? + | + +void initControls(); + -dynamic _uniqueInviteCode(); + +void regenerateCode(); + -String _generateCode(); + +StudyInvite buildFormData(); + +void setControlsFrom(); + +dynamic save() + ] + + [InviteCodeFormViewModel]o-[Study] + [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] + [InviteCodeFormViewModel]o-[FormControl] + [InviteCodeFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] + + [EnrolledBadge + | + +enrolledCount: int + | +Widget build() ] - [PasswordForgotForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] + [InviteCodeFormView + | + +formViewModel: InviteCodeFormViewModel + | + +Widget build(); + -List<FormTableRow> _conditionalInterventionRows() + ] - [StudyUJobsToBeDone + [InviteCodeFormView]o-[InviteCodeFormViewModel] + [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] + + [StudyRecruitScreen + | + +Widget build(); + -Widget _inviteCodesSectionHeader(); + -Widget _newInviteCodeButton(); + -dynamic _onSelectInvite() + ] + + [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] + + [StudyRecruitController + | + +inviteCodeRepository: IInviteCodeRepository; + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + | + -dynamic _subscribeInvites(); + +Intervention? getIntervention(); + +int getParticipantCountForInvite(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void dispose() + ] + + [StudyRecruitController]o-[<abstract>IInviteCodeRepository] + [StudyRecruitController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyRecruitController] + [<abstract>IModelActionProvider]<:--[StudyRecruitController] + + [StudyInvitesTable + | + +invites: List<StudyInvite>; + +onSelect: void Function(StudyInvite); + +getActions: List<ModelAction<dynamic>> Function(StudyInvite); + +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite); + +getIntervention: Intervention? Function(String); + +getParticipantCountForInvite: int Function(StudyInvite) + | + +Widget build(); + -List<Widget> _buildRow() + ] + + [StudyInvitesTable]o-[void Function(StudyInvite)] + [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] + [StudyInvitesTable]o-[Intervention? Function(String)] + [StudyInvitesTable]o-[int Function(StudyInvite)] + + [AuthScaffold + | + +body: Widget; + +formKey: AuthFormKey; + +leftContentMinWidth: double; + +leftPanelMinWidth: double; + +leftPanelPadding: EdgeInsets + ] + + [AuthScaffold]o-[<abstract>Widget] + [AuthScaffold]o-[AuthFormKey] + [AuthScaffold]o-[EdgeInsets] + + [SignupForm + | + +formKey: AuthFormKey + | + +Widget build(); + -dynamic _onClickTermsOfUse(); + -dynamic _onClickPrivacyPolicy() + ] + + [SignupForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[SignupForm] + + [PasswordRecoveryForm + | + +formKey: AuthFormKey + | + +Widget build() + ] + + [PasswordRecoveryForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] + + [PasswordForgotForm + | + +formKey: AuthFormKey | +Widget build() ] + [PasswordForgotForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] + [AuthFormController | +authRepository: IAuthRepository; @@ -393,581 +557,439 @@ [PasswordTextField]o-[FormControl] - [<abstract>IAppDelegate + [StudyUJobsToBeDone | - +dynamic onAppStart() + +Widget build() ] - [AppController + [LoginForm | - +sharedPreferences: SharedPreferences; - +appDelegates: List<IAppDelegate>; - -_delayedFuture: dynamic; - +isInitialized: dynamic + +formKey: AuthFormKey | - +dynamic onAppStart(); - -dynamic _callDelegates() + +Widget build() ] - [AppController]o-[SharedPreferences] + [LoginForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[LoginForm] - [InviteCodeFormView - | - +formViewModel: InviteCodeFormViewModel + [StudyAnalyzeController | - +Widget build(); - -List<FormTableRow> _conditionalInterventionRows() + +dynamic onExport() ] - [InviteCodeFormView]o-[InviteCodeFormViewModel] - [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] + [StudyBaseController]<:-[StudyAnalyzeController] - [StudyRecruitScreen + [StudyAnalyzeScreen | - +Widget build(); - -Widget _inviteCodesSectionHeader(); - -Widget _newInviteCodeButton(); - -dynamic _onSelectInvite() + +Widget? banner(); + +Widget build() ] - [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] + [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] - [StudyRecruitController - | - +inviteCodeRepository: IInviteCodeRepository; - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + [PublishDialog | - -dynamic _subscribeInvites(); - +Intervention? getIntervention(); - +int getParticipantCountForInvite(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void dispose() + +Widget build() ] - [StudyRecruitController]o-[<abstract>IInviteCodeRepository] - [StudyRecruitController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyRecruitController] - [<abstract>IModelActionProvider]<:--[StudyRecruitController] + [<abstract>StudyPageWidget]<:-[PublishDialog] - [InviteCodeFormViewModel - | - +study: Study; - +inviteCodeRepository: IInviteCodeRepository; - +codeControl: FormControl<String>; - +codeControlValidationMessages: Map<String, String Function(dynamic)>; - +isPreconfiguredScheduleControl: FormControl<bool>; - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence>; - +interventionAControl: FormControl<String>; - +interventionBControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +interventionControlOptions: List<FormControlOption<String>>; - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; - +isPreconfiguredSchedule: bool; - +preconfiguredSchedule: List<String>? + [PublishSuccessDialog | - +void initControls(); - -dynamic _uniqueInviteCode(); - +void regenerateCode(); - -String _generateCode(); - +StudyInvite buildFormData(); - +void setControlsFrom(); - +dynamic save() + +Widget build() ] - [InviteCodeFormViewModel]o-[Study] - [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] - [InviteCodeFormViewModel]o-[FormControl] - [InviteCodeFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] + [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] - [EnrolledBadge - | - +enrolledCount: int + [PublishConfirmationDialog | +Widget build() ] - [StudyInvitesTable - | - +invites: List<StudyInvite>; - +onSelect: void Function(StudyInvite); - +getActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getIntervention: Intervention? Function(String); - +getParticipantCountForInvite: int Function(StudyInvite) - | - +Widget build(); - -List<Widget> _buildRow() + [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] + + [App ] - [StudyInvitesTable]o-[void Function(StudyInvite)] - [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] - [StudyInvitesTable]o-[Intervention? Function(String)] - [StudyInvitesTable]o-[int Function(StudyInvite)] + [AppContent + ] - [StudyFormViewModel - | - +studyDirtyCopy: Study?; - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +router: GoRouter; - +studyInfoFormViewModel: StudyInfoFormViewModel; - +enrollmentFormViewModel: EnrollmentFormViewModel; - +measurementsFormViewModel: MeasurementsFormViewModel; - +reportsFormViewModel: ReportsFormViewModel; - +interventionsFormViewModel: InterventionsFormViewModel; - +form: FormGroup; - +isStudyReadonly: bool; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String> + [<abstract>IStudyAppBarViewModel | - +void read(); - +void setControlsFrom(); - +Study buildFormData(); - +void dispose(); - +void onCancel(); - +dynamic onSave(); - -dynamic _applyAndSaveSubform() + +isSyncIndicatorVisible: bool; + +isStatusBadgeVisible: bool; + +isPublishVisible: bool ] - [StudyFormViewModel]o-[Study] - [StudyFormViewModel]o-[<abstract>IStudyRepository] - [StudyFormViewModel]o-[<abstract>IAuthRepository] - [StudyFormViewModel]o-[GoRouter] - [StudyFormViewModel]o-[StudyInfoFormViewModel] - [StudyFormViewModel]o-[EnrollmentFormViewModel] - [StudyFormViewModel]o-[MeasurementsFormViewModel] - [StudyFormViewModel]o-[ReportsFormViewModel] - [StudyFormViewModel]o-[InterventionsFormViewModel] - [StudyFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] + [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] + [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] - [ConsentItemFormView + [StudyScaffold | - +formViewModel: ConsentItemFormViewModel + +studyId: String; + +tabs: List<NavbarTab>?; + +tabsSubnav: List<NavbarTab>?; + +selectedTab: NavbarTab?; + +selectedTabSubnav: NavbarTab?; + +body: StudyPageWidget; + +drawer: Widget?; + +disableActions: bool; + +actionsSpacing: double; + +actionsPadding: double; + +layoutType: SingleColumnLayoutType?; + +appbarHeight: double; + +appbarSubnavHeight: double ] - [ConsentItemFormView]o-[ConsentItemFormViewModel] + [StudyScaffold]o-[NavbarTab] + [StudyScaffold]o-[<abstract>StudyPageWidget] + [StudyScaffold]o-[<abstract>Widget] + [StudyScaffold]o-[SingleColumnLayoutType] - [EnrollmentFormData - | - <static>+kDefaultEnrollmentType: Participation; - +enrollmentType: Participation; - +questionnaireFormData: QuestionnaireFormData; - +consentItemsFormData: List<ConsentItemFormData>?; - +id: String + [PreviewFrame | - +Study apply(); - +EnrollmentFormData copy() + +studyId: String; + +routeArgs: StudyFormRouteArgs?; + +route: String? ] - [EnrollmentFormData]o-[Participation] - [EnrollmentFormData]o-[QuestionnaireFormData] - [<abstract>IStudyFormData]<:--[EnrollmentFormData] + [PreviewFrame]o-[<abstract>StudyFormRouteArgs] - [StudyDesignEnrollmentFormView + [StudyParticipationBadge | - +Widget build(); - -dynamic _showScreenerQuestionSidesheetWithArgs(); - -dynamic _showConsentItemSidesheetWithArgs() + +participation: Participation; + +type: BadgeType; + +showPrefixIcon: bool + | + +Widget build() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] + [StudyParticipationBadge]o-[Participation] + [StudyParticipationBadge]o-[BadgeType] - [ConsentItemFormViewModel + [<abstract>StudyPageWidget | - +consentIdControl: FormControl<String>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +form: FormGroup; - +consentId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +titles: Map<FormMode, String> + +studyId: String | - +void setControlsFrom(); - +ConsentItemFormData buildFormData(); - +ConsentItemFormViewModel createDuplicate() + +Widget? banner() ] - [ConsentItemFormViewModel]o-[FormControl] - [ConsentItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] + [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] + [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] - [<abstract>IScreenerQuestionLogicFormViewModel + [<abstract>IStudyStatusBadgeViewModel | - +isDirtyOptionsBannerVisible: bool + +studyParticipation: Participation?; + +studyStatus: StudyStatus? ] - [ScreenerQuestionLogicFormView + [<abstract>IStudyStatusBadgeViewModel]o-[Participation] + [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] + + [StudyStatusBadge | - +formViewModel: ScreenerQuestionFormViewModel + +participation: Participation?; + +status: StudyStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool | - +Widget build(); - -dynamic _buildInfoBanner(); - -dynamic _buildAnswerOptionsLogicControls(); - -List<Widget> _buildOptionLogicRow() + +Widget build() ] - [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] - [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] + [StudyStatusBadge]o-[Participation] + [StudyStatusBadge]o-[StudyStatus] + [StudyStatusBadge]o-[BadgeType] - [ScreenerQuestionFormViewModel + [FrameControlsWidget | - <static>+defaultResponseOptionValidity: bool; - +responseOptionsDisabledArray: FormArray<dynamic>; - +responseOptionsLogicControls: FormArray<bool>; - +responseOptionsLogicDescriptionControls: FormArray<String>; - -_questionBaseControls: Map<String, AbstractControl<dynamic>>; - +prevResponseOptionControls: List<AbstractControl<dynamic>>; - +prevResponseOptionValues: List<dynamic>; - +responseOptionsDisabledControls: List<AbstractControl<dynamic>>; - +logicControlOptions: List<FormControlOption<bool>>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isDirtyOptionsBannerVisible: bool + +onRefresh: void Function()?; + +onOpenNewTab: void Function()?; + +enabled: bool | - +dynamic onResponseOptionsChanged(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - -List<FormControl<dynamic>> _copyFormControls(); - -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); - -AbstractControl<dynamic>? _findAssociatedControlFor(); - +ScreenerQuestionFormViewModel createDuplicate() + +Widget build() ] - [ScreenerQuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] - [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] + [FrameControlsWidget]o-[void Function()?] + [<abstract>ConsumerWidget]<:-[FrameControlsWidget] - [EnrollmentFormViewModel + [StudyTestScreen | - +study: Study; - +router: GoRouter; - +consentItemDelegate: EnrollmentFormConsentItemDelegate; - +enrollmentTypeControl: FormControl<Participation>; - +consentItemArray: FormArray<dynamic>; - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +form: FormGroup; - +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; - +consentItemModels: List<ConsentItemFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestScreener: bool; - +canTestConsent: bool; - +questionTitles: Map<FormMode, String Function()> + +previewRoute: String? | - +void setControlsFrom(); - +EnrollmentFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); - +dynamic testScreener(); - +dynamic testConsent(); - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + +Widget build(); + +Widget? banner(); + +dynamic load(); + +dynamic save(); + +dynamic showHelp() ] - [EnrollmentFormViewModel]o-[Study] - [EnrollmentFormViewModel]o-[GoRouter] - [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] - [EnrollmentFormViewModel]o-[FormControl] - [EnrollmentFormViewModel]o-[FormArray] - [EnrollmentFormViewModel]o-[FormViewModelCollection] - [EnrollmentFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] - [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] + [<abstract>StudyPageWidget]<:-[StudyTestScreen] - [EnrollmentFormConsentItemDelegate - | - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +owner: EnrollmentFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic + [<abstract>IStudyNavViewModel | - +void onCancel(); - +dynamic onSave(); - +ConsentItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + +isEditTabEnabled: bool; + +isTestTabEnabled: bool; + +isRecruitTabEnabled: bool; + +isMonitorTabEnabled: bool; + +isAnalyzeTabEnabled: bool; + +isSettingsEnabled: bool ] - [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] - [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] - - [ConsentItemFormData + [StudyNav | - +consentId: String; - +title: String; - +description: String; - +iconName: String?; - +id: String + <static>+dynamic tabs(); + <static>+dynamic edit(); + <static>+dynamic test(); + <static>+dynamic recruit(); + <static>+dynamic monitor(); + <static>+dynamic analyze() + ] + + [StudyDesignNav | - +ConsentItem toConsentItem(); - +ConsentItemFormData copy() + <static>+dynamic tabs(); + <static>+dynamic info(); + <static>+dynamic enrollment(); + <static>+dynamic interventions(); + <static>+dynamic measurements(); + <static>+dynamic reports() ] - [<abstract>IFormData]<:-[ConsentItemFormData] + [RouteInformation + | + +route: String?; + +extra: String?; + +cmd: String?; + +data: String? + | + +String toString() + ] - [InterventionsFormData + [<abstract>PlatformController | - +interventionsData: List<InterventionFormData>; - +studyScheduleData: StudyScheduleFormData; - +id: String + +studyId: String; + +baseSrc: String; + +previewSrc: String; + +routeInformation: RouteInformation; + +frameWidget: Widget | - +Study apply(); - +InterventionsFormData copy() + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void listen(); + +void send(); + +void openNewPage() ] - [InterventionsFormData]o-[StudyScheduleFormData] - [<abstract>IStudyFormData]<:--[InterventionsFormData] + [<abstract>PlatformController]o-[RouteInformation] + [<abstract>PlatformController]o-[<abstract>Widget] - [InterventionTaskFormViewModel + [WebController | - +taskIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +taskTitleControl: FormControl<String>; - +taskDescriptionControl: FormControl<String>; - +markAsCompletedControl: FormControl<bool>; - +form: FormGroup; - +taskId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +titles: Map<FormMode, String> + +iFrameElement: IFrameElement | - +void setControlsFrom(); - +InterventionTaskFormData buildFormData(); - +InterventionTaskFormViewModel createDuplicate() + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void openNewPage(); + +void listen(); + +void send() ] - [InterventionTaskFormViewModel]o-[FormControl] - [InterventionTaskFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] - [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] + [WebController]o-[IFrameElement] + [<abstract>PlatformController]<:-[WebController] - [InterventionTaskFormView + [MobileController | - +formViewModel: InterventionTaskFormViewModel + +void openNewPage(); + +void refresh(); + +void registerViews(); + +void listen(); + +void send(); + +void navigate(); + +void activate(); + +void generateUrl() ] - [InterventionTaskFormView]o-[InterventionTaskFormViewModel] + [<abstract>PlatformController]<:-[MobileController] - [StudyScheduleFormData + [StudySettingsFormViewModel | - +sequenceType: PhaseSequence; - +sequenceTypeCustom: String; - +numCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +id: String + +study: AsyncValue<Study>; + +studyRepository: IStudyRepository; + <static>+defaultPublishedToRegistry: bool; + <static>+defaultPublishedToRegistryResults: bool; + +isPublishedToRegistryControl: FormControl<bool>; + +isPublishedToRegistryResultsControl: FormControl<bool>; + +form: FormGroup; + +titles: Map<FormMode, String> | - +StudySchedule toStudySchedule(); - +Study apply(); - +StudyScheduleFormData copy() + +void setControlsFrom(); + +Study buildFormData(); + +dynamic keepControlsSynced(); + +dynamic save(); + +dynamic setLaunchDefaults() ] - [StudyScheduleFormData]o-[PhaseSequence] - [<abstract>IStudyFormData]<:--[StudyScheduleFormData] + [StudySettingsFormViewModel]o-[<abstract>AsyncValue] + [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] + [StudySettingsFormViewModel]o-[FormControl] + [StudySettingsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] - [InterventionFormView + [StudySettingsDialog | - +formViewModel: InterventionFormViewModel + +Widget build() ] - [InterventionFormView]o-[InterventionFormViewModel] + [<abstract>StudyPageWidget]<:-[StudySettingsDialog] - [InterventionsFormViewModel + [StudyBaseController | - +study: Study; + +studyId: String; + +studyRepository: IStudyRepository; +router: GoRouter; - +interventionsArray: FormArray<dynamic>; - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; - +form: FormGroup; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +interventionsRequired: dynamic; - +titles: Map<FormMode, String>; - +canTestStudySchedule: bool + +studySubscription: StreamSubscription<WrappedModel<Study>>? | - +void setControlsFrom(); - +InterventionsFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +InterventionFormViewModel provide(); - +void onCancel(); - +dynamic onSave(); - +dynamic testStudySchedule() + +dynamic subscribeStudy(); + +dynamic onStudySubscriptionUpdate(); + +dynamic onStudySubscriptionError(); + +void dispose() ] - [InterventionsFormViewModel]o-[Study] - [InterventionsFormViewModel]o-[GoRouter] - [InterventionsFormViewModel]o-[FormArray] - [InterventionsFormViewModel]o-[FormViewModelCollection] - [InterventionsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InterventionsFormViewModel] - [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] + [StudyBaseController]o-[<abstract>IStudyRepository] + [StudyBaseController]o-[GoRouter] + [StudyBaseController]o-[StreamSubscription] - [InterventionFormData + [WebFrame | - +interventionId: String; - +title: String; - +description: String?; - +tasksData: List<InterventionTaskFormData>?; - +iconName: String?; - <static>+kDefaultTitle: String; - +id: String + +previewSrc: String; + +studyId: String | - +Intervention toIntervention(); - +InterventionFormData copy() + +Widget build() ] - [<abstract>IFormData]<:-[InterventionFormData] + [DisabledFrame + | + +Widget build() + ] - [StudyScheduleFormView + [PhoneContainer | - +formViewModel: StudyScheduleControls + <static>+defaultWidth: double; + <static>+defaultHeight: double; + +width: double; + +height: double; + +borderColor: Color; + +borderWidth: double; + +borderRadius: double; + +innerContent: Widget; + +innerContentBackgroundColor: Color? | - -FormTableRow _renderCustomSequence(); +Widget build() ] - [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] - [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] + [PhoneContainer]o-[Color] + [PhoneContainer]o-[<abstract>Widget] - [InterventionFormViewModel + [MobileFrame | - +study: Study; - +interventionIdControl: FormControl<String>; - +interventionTitleControl: FormControl<String>; - +interventionIconControl: FormControl<IconOption>; - +interventionDescriptionControl: FormControl<String>; - +interventionTasksArray: FormArray<dynamic>; - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; - +form: FormGroup; - +interventionId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneTask: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> + +Widget build() + ] + + [DesktopFrame | - +void setControlsFrom(); - +InterventionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +void onCancel(); - +dynamic onSave(); - +InterventionTaskFormViewModel provide(); - +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); - +InterventionTaskFormRouteArgs buildFormRouteArgs(); - +InterventionFormViewModel createDuplicate() + +Widget build() ] - [InterventionFormViewModel]o-[Study] - [InterventionFormViewModel]o-[FormControl] - [InterventionFormViewModel]o-[FormArray] - [InterventionFormViewModel]o-[FormViewModelCollection] - [InterventionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] - - [<abstract>StudyScheduleControls - | - <static>+defaultScheduleType: PhaseSequence; - <static>+defaultScheduleTypeSequence: String; - <static>+defaultNumCycles: int; - <static>+defaultPeriodLength: int; - +sequenceTypeControl: FormControl<PhaseSequence>; - +sequenceTypeCustomControl: FormControl<String>; - +phaseDurationControl: FormControl<int>; - +numCyclesControl: FormControl<int>; - +includeBaselineControl: FormControl<bool>; - +studyScheduleControls: Map<String, FormControl<Object>>; - <static>+kNumCyclesMin: int; - <static>+kNumCyclesMax: int; - <static>+kPhaseDurationMin: int; - <static>+kPhaseDurationMax: int; - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +numCyclesRange: dynamic; - +phaseDurationRange: dynamic; - +customSequenceRequired: dynamic + [StudyTestController | - +void setStudyScheduleControlsFrom(); - +StudyScheduleFormData buildStudyScheduleFormData(); - +bool isSequencingCustom() + +authRepository: IAuthRepository; + +languageCode: String ] - [<abstract>StudyScheduleControls]o-[PhaseSequence] - [<abstract>StudyScheduleControls]o-[FormControl] + [StudyTestController]o-[<abstract>IAuthRepository] + [StudyBaseController]<:-[StudyTestController] - [StudyDesignInterventionsFormView + [StudyController | - +Widget build() + +notificationService: INotificationService; + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; + +studyActions: List<ModelAction<dynamic>> + | + +dynamic syncStudyStatus(); + +dynamic onStudySubscriptionUpdate(); + -dynamic _redirectNewToActualStudyID(); + +dynamic publishStudy(); + +void onChangeStudyParticipation(); + +void onAddParticipants(); + +void onSettingsPressed(); + +void dispose() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] + [StudyController]o-[<abstract>INotificationService] + [StudyController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyController] - [InterventionTaskFormData - | - +taskId: String; - +taskTitle: String; - +taskDescription: String?; - <static>+kDefaultTitle: String; - +id: String + [TestAppRoutes | - +CheckmarkTask toTask(); - +InterventionTaskFormData copy() + <static>+studyOverview: String; + <static>+eligibility: String; + <static>+intervention: String; + <static>+consent: String; + <static>+journey: String; + <static>+dashboard: String ] - [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] - - [InterventionPreview - | - +routeArgs: InterventionFormRouteArgs + [StudyDesignInfoFormView | +Widget build() ] - [InterventionPreview]o-[InterventionFormRouteArgs] - [<abstract>ConsumerWidget]<:-[InterventionPreview] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] - [StudyFormValidationSet + [StudyInfoFormViewModel | - +index: int; - <static>+values: List<StudyFormValidationSet> + +study: Study; + +titleControl: FormControl<String>; + +iconControl: FormControl<IconOption>; + +descriptionControl: FormControl<String>; + +organizationControl: FormControl<String>; + +reviewBoardControl: FormControl<String>; + +reviewBoardNumberControl: FormControl<String>; + +researchersControl: FormControl<String>; + +emailControl: FormControl<String>; + +websiteControl: FormControl<String>; + +phoneControl: FormControl<String>; + +additionalInfoControl: FormControl<String>; + +form: FormGroup; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +iconRequired: dynamic; + +organizationRequired: dynamic; + +reviewBoardRequired: dynamic; + +reviewBoardNumberRequired: dynamic; + +researchersRequired: dynamic; + +emailRequired: dynamic; + +phoneRequired: dynamic; + +emailFormat: dynamic; + +websiteFormat: dynamic + | + +void setControlsFrom(); + +StudyInfoFormData buildFormData() ] - [Enum]<:--[StudyFormValidationSet] + [StudyInfoFormViewModel]o-[Study] + [StudyInfoFormViewModel]o-[FormControl] + [StudyInfoFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] [StudyInfoFormData | @@ -1002,50 +1024,33 @@ [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - [StudyDesignInfoFormView + [StudyFormScaffold + | + +studyId: String; + +formViewModelBuilder: T Function(WidgetRef); + +formViewBuilder: Widget Function(T) | +Widget build() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] + [StudyFormScaffold]o-[T Function(WidgetRef)] + [StudyFormScaffold]o-[Widget Function(T)] + [<abstract>ConsumerWidget]<:-[StudyFormScaffold] - [StudyInfoFormViewModel + [StudyFormValidationSet | - +study: Study; - +titleControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +descriptionControl: FormControl<String>; - +organizationControl: FormControl<String>; - +reviewBoardControl: FormControl<String>; - +reviewBoardNumberControl: FormControl<String>; - +researchersControl: FormControl<String>; - +emailControl: FormControl<String>; - +websiteControl: FormControl<String>; - +phoneControl: FormControl<String>; - +additionalInfoControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +iconRequired: dynamic; - +organizationRequired: dynamic; - +reviewBoardRequired: dynamic; - +reviewBoardNumberRequired: dynamic; - +researchersRequired: dynamic; - +emailRequired: dynamic; - +phoneRequired: dynamic; - +emailFormat: dynamic; - +websiteFormat: dynamic + +index: int; + <static>+values: List<StudyFormValidationSet> + ] + + [Enum]<:--[StudyFormValidationSet] + + [StudyDesignMeasurementsFormView | - +void setControlsFrom(); - +StudyInfoFormData buildFormData() + +Widget build() ] - [StudyInfoFormViewModel]o-[Study] - [StudyInfoFormViewModel]o-[FormControl] - [StudyInfoFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] [MeasurementsFormViewModel | @@ -1082,29 +1087,16 @@ [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] - [StudyDesignMeasurementsFormView - | - +Widget build() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] - - [SurveyPreview - | - +routeArgs: MeasurementFormRouteArgs + [MeasurementsFormData | - +Widget build() - ] - - [SurveyPreview]o-[MeasurementFormRouteArgs] - [<abstract>ConsumerWidget]<:-[SurveyPreview] - - [MeasurementSurveyFormView + +surveyMeasurements: List<MeasurementSurveyFormData>; + +id: String | - +formViewModel: MeasurementSurveyFormViewModel + +Study apply(); + +MeasurementsFormData copy() ] - [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] + [<abstract>IStudyFormData]<:--[MeasurementsFormData] [MeasurementSurveyFormViewModel | @@ -1162,327 +1154,271 @@ [MeasurementSurveyFormData]o-[QuestionnaireFormData] [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] - [MeasurementsFormData + [SurveyPreview | - +surveyMeasurements: List<MeasurementSurveyFormData>; - +id: String + +routeArgs: MeasurementFormRouteArgs | - +Study apply(); - +MeasurementsFormData copy() + +Widget build() ] - [<abstract>IStudyFormData]<:--[MeasurementsFormData] + [SurveyPreview]o-[MeasurementFormRouteArgs] + [<abstract>ConsumerWidget]<:-[SurveyPreview] - [<abstract>IStudyFormData + [MeasurementSurveyFormView | - +Study apply() + +formViewModel: MeasurementSurveyFormViewModel ] - [<abstract>IFormData]<:--[<abstract>IStudyFormData] + [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] - [<abstract>StudyDesignPageWidget + [<abstract>IStudyFormData | - +Widget? banner() + +Study apply() ] - [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] + [<abstract>IFormData]<:--[<abstract>IStudyFormData] - [StudyFormScaffold + [ReportsFormViewModel | - +studyId: String; - +formViewModelBuilder: T Function(WidgetRef); - +formViewBuilder: Widget Function(T) + +study: Study; + +router: GoRouter; + +reportItemDelegate: ReportFormItemDelegate; + +reportItemArray: FormArray<dynamic>; + +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; + +form: FormGroup; + +reportItemModels: List<ReportItemFormViewModel>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titles: Map<FormMode, String>; + +canTestConsent: bool | - +Widget build() + +void setControlsFrom(); + +ReportsFormData buildFormData(); + +void read(); + +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); + +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); + +dynamic testReport(); + +void onCancel(); + +dynamic onSave(); + +ReportItemFormViewModel provide() ] - [StudyFormScaffold]o-[T Function(WidgetRef)] - [StudyFormScaffold]o-[Widget Function(T)] - [<abstract>ConsumerWidget]<:-[StudyFormScaffold] + [ReportsFormViewModel]o-[Study] + [ReportsFormViewModel]o-[GoRouter] + [ReportsFormViewModel]o-[ReportFormItemDelegate] + [ReportsFormViewModel]o-[FormArray] + [ReportsFormViewModel]o-[FormViewModelCollection] + [ReportsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[ReportsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[ReportsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[ReportsFormViewModel] - [<abstract>WithScheduleControls + [ReportFormItemDelegate | - +isTimeRestrictedControl: FormControl<bool>; - +instanceID: FormControl<String>; - +restrictedTimeStartControl: FormControl<Time>; - +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; - +restrictedTimeEndControl: FormControl<Time>; - +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; - +hasReminderControl: FormControl<bool>; - +reminderTimeControl: FormControl<Time>; - +reminderTimePickerControl: FormControl<TimeOfDay>; - -_reminderControlStream: StreamSubscription<dynamic>?; - +scheduleFormControls: Map<String, FormControl<Object>>; - +hasReminder: bool; - +isTimeRestricted: bool; - +timeRestriction: List<Time>? + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; + +owner: ReportsFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic | - +void setScheduleControlsFrom(); - -dynamic _initReminderControl() + +void onCancel(); + +dynamic onSave(); + +ReportItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() ] - [<abstract>WithScheduleControls]o-[FormControl] - [<abstract>WithScheduleControls]o-[StreamSubscription] + [ReportFormItemDelegate]o-[FormViewModelCollection] + [ReportFormItemDelegate]o-[ReportsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] + [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] + [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] - [<abstract>IFormDataWithSchedule + [ReportItemFormView | - +instanceId: String; - +isTimeLocked: bool; - +timeLockStart: StudyUTimeOfDay?; - +timeLockEnd: StudyUTimeOfDay?; - +hasReminder: bool; - +reminderTime: StudyUTimeOfDay? + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: dynamic; + +sectionTypeBodyBuilder: Widget Function(BuildContext) | - +Schedule toSchedule() + +Widget build(); + -dynamic _buildSectionText(); + -dynamic _buildSectionTypeHeader() ] - [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] - [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] + [ReportItemFormView]o-[ReportItemFormViewModel] + [ReportItemFormView]o-[Widget Function(BuildContext)] - [ScheduleControls + [LinearRegressionSectionFormView | - +formViewModel: WithScheduleControls + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | - +Widget build(); - -List<FormTableRow> _conditionalTimeRestrictions() + +Widget build() ] - [ScheduleControls]o-[<abstract>WithScheduleControls] - [<abstract>FormConsumerWidget]<:-[ScheduleControls] + [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - [QuestionFormViewModel + [DataReferenceIdentifier | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +form: FormGroup; - +questionId: String; - +questionType: SurveyQuestionType; - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; - +answerOptionsArray: FormArray<dynamic>; - +answerOptionsControls: List<AbstractControl<dynamic>>; - +validAnswerOptions: List<String>; - +boolOptions: List<AbstractControl<String>>; - +scaleMinValue: int; - +scaleMaxValue: int; - +scaleRange: int; - +scaleAllValueControls: List<AbstractControl<int>>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +questionTextRequired: dynamic; - +numValidChoiceOptions: dynamic; - +scaleRangeValid: dynamic; - +titles: Map<FormMode, String>; - +isAddOptionButtonVisible: bool; - +isMidValuesClearedInfoVisible: bool + +hashCode: int | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); - +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem(); - +QuestionFormViewModel createDuplicate() + +bool ==() ] - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + [DataReference]<:-[DataReferenceIdentifier] - [<abstract>QuestionFormData + [DataReferenceEditor | - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; - +questionId: String; - +questionText: String; - +questionInfoText: String?; - +questionType: SurveyQuestionType; - +responseOptionsValidity: Map<dynamic, bool>; - +responseOptions: List<dynamic>; - +id: String + +formControl: FormControl<DataReferenceIdentifier<T>>; + +availableTasks: List<Task>; + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> | - +Question<dynamic> toQuestion(); - +EligibilityCriterion toEligibilityCriterion(); - +Answer<dynamic> constructAnswerFor(); - +dynamic setResponseOptionsValidityFrom(); - +QuestionFormData copy() + +FormTableRow buildFormTableRow(); + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() ] - [<abstract>QuestionFormData]o-[SurveyQuestionType] - [<abstract>IFormData]<:--[<abstract>QuestionFormData] + [DataReferenceEditor]o-[FormControl] + [DataReferenceEditor]o-[ReactiveDropdownField] - [ChoiceQuestionFormData + [TemporalAggregationFormatted | - +isMultipleChoice: bool; - +answerOptions: List<String>; - +responseOptions: List<String> + -_value: TemporalAggregation; + <static>+values: List<TemporalAggregationFormatted>; + +value: TemporalAggregation; + +string: String; + +icon: IconData?; + +hashCode: int | - +Question<dynamic> toQuestion(); - +QuestionFormData copy(); - -Choice _buildChoiceForValue(); - +Answer<dynamic> constructAnswerFor() + +bool ==(); + +String toString(); + +String toJson(); + <static>+TemporalAggregationFormatted fromJson() ] - [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] + [TemporalAggregationFormatted]o-[TemporalAggregation] + [TemporalAggregationFormatted]o-[IconData] - [BoolQuestionFormData + [ImprovementDirectionFormatted | - <static>+kResponseOptions: Map<String, bool>; - +responseOptions: List<String> + -_value: ImprovementDirection; + <static>+values: List<ImprovementDirectionFormatted>; + +value: ImprovementDirection; + +string: String; + +icon: IconData?; + +hashCode: int | - +Question<dynamic> toQuestion(); - +BoolQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +bool ==(); + +String toString(); + +String toJson(); + <static>+ImprovementDirectionFormatted fromJson() ] - [<abstract>QuestionFormData]<:-[BoolQuestionFormData] + [ImprovementDirectionFormatted]o-[ImprovementDirection] + [ImprovementDirectionFormatted]o-[IconData] - [ScaleQuestionFormData - | - +minValue: double; - +maxValue: double; - +minLabel: String?; - +maxLabel: String?; - +midValues: List<double?>; - +midLabels: List<String?>; - +stepSize: double; - +initialValue: double?; - +minColor: Color?; - +maxColor: Color?; - +responseOptions: List<double>; - +midAnnotations: List<Annotation> + [ReportSectionType | - +ScaleQuestion toQuestion(); - +QuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +index: int; + <static>+values: List<ReportSectionType>; + <static>+average: ReportSectionType; + <static>+linearRegression: ReportSectionType ] - [ScaleQuestionFormData]o-[Color] - [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] + [ReportSectionType]o-[ReportSectionType] + [Enum]<:--[ReportSectionType] - [<abstract>IScaleQuestionFormViewModel + [AverageSectionFormView | - +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | - +formViewModel: QuestionFormViewModel + +Widget build() ] - [ScaleQuestionFormView]o-[QuestionFormViewModel] + [AverageSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[AverageSectionFormView] - [SurveyQuestionType + [ReportItemFormViewModel | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType - ] - - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] - - [BoolQuestionFormView - | - +formViewModel: QuestionFormViewModel + <static>+defaultSectionType: ReportSectionType; + +sectionIdControl: FormControl<String>; + +sectionTypeControl: FormControl<ReportSectionType>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +sectionControl: FormControl<ReportSection>; + +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; + +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; + +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; + +alphaControl: FormControl<double>; + -_controlsBySectionType: Map<ReportSectionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +sectionBaseControls: Map<String, AbstractControl<dynamic>>; + +form: FormGroup; + +sectionId: String; + +sectionType: ReportSectionType; + <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; + <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; + <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +dataReferenceRequired: dynamic; + +aggregationRequired: dynamic; + +improvementDirectionRequired: dynamic; + +alphaConfidenceRequired: dynamic | - +Widget build() + -List<FormControlValidation> _getValidationConfig(); + +ReportItemFormData buildFormData(); + +ReportItemFormViewModel createDuplicate(); + +dynamic onSectionTypeChanged(); + -void _updateFormControls(); + +void setControlsFrom() ] - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] + [ReportItemFormViewModel]o-[ReportSectionType] + [ReportItemFormViewModel]o-[FormControl] + [ReportItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] - [ChoiceQuestionFormView - | - +formViewModel: QuestionFormViewModel + [ReportItemFormData | - +Widget build() - ] - - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - - [SurveyQuestionFormView + +isPrimary: bool; + +section: ReportSection; + +id: String | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool + <static>+dynamic fromDomainModel(); + +ReportItemFormData copy() ] - [SurveyQuestionFormView]o-[QuestionFormViewModel] + [ReportItemFormData]o-[<abstract>ReportSection] + [<abstract>IFormData]<:-[ReportItemFormData] - [QuestionnaireFormData + [ReportsFormData | - +questionsData: List<QuestionFormData>?; + +reportItems: List<ReportItemFormData>; +id: String | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() + +Study apply(); + +ReportsFormData copy() ] - [<abstract>IFormData]<:--[QuestionnaireFormData] + [<abstract>IStudyFormData]<:--[ReportsFormData] - [<abstract>WithQuestionnaireControls - | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> + [ReportStatus | - +void setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); - +void read(); - +void onCancel(); - +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() + +index: int; + <static>+values: List<ReportStatus>; + <static>+primary: ReportStatus; + <static>+secondary: ReportStatus ] - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] + [ReportStatus]o-[ReportStatus] + [Enum]<:--[ReportStatus] [StudyDesignReportsFormView | @@ -1492,706 +1428,763 @@ [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] - [ReportsFormViewModel + [ReportBadge | - +study: Study; - +router: GoRouter; - +reportItemDelegate: ReportFormItemDelegate; - +reportItemArray: FormArray<dynamic>; - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +form: FormGroup; - +reportItemModels: List<ReportItemFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestConsent: bool + +status: ReportStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool | - +void setControlsFrom(); - +ReportsFormData buildFormData(); - +void read(); - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); - +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); - +dynamic testReport(); - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide() + +Widget build() ] - [ReportsFormViewModel]o-[Study] - [ReportsFormViewModel]o-[GoRouter] - [ReportsFormViewModel]o-[ReportFormItemDelegate] - [ReportsFormViewModel]o-[FormArray] - [ReportsFormViewModel]o-[FormViewModelCollection] - [ReportsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[ReportsFormViewModel] + [ReportBadge]o-[ReportStatus] + [ReportBadge]o-[BadgeType] - [ReportFormItemDelegate - | - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +owner: ReportsFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic + [StudyDesignEnrollmentFormView | - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + +Widget build(); + -dynamic _showScreenerQuestionSidesheetWithArgs(); + -dynamic _showConsentItemSidesheetWithArgs() ] - [ReportFormItemDelegate]o-[FormViewModelCollection] - [ReportFormItemDelegate]o-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] - [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] - [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] - [ReportItemFormView + [ConsentItemFormData | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: dynamic; - +sectionTypeBodyBuilder: Widget Function(BuildContext) + +consentId: String; + +title: String; + +description: String; + +iconName: String?; + +id: String | - +Widget build(); - -dynamic _buildSectionText(); - -dynamic _buildSectionTypeHeader() + +ConsentItem toConsentItem(); + +ConsentItemFormData copy() ] - [ReportItemFormView]o-[ReportItemFormViewModel] - [ReportItemFormView]o-[Widget Function(BuildContext)] + [<abstract>IFormData]<:-[ConsentItemFormData] - [TemporalAggregationFormatted + [EnrollmentFormData | - -_value: TemporalAggregation; - <static>+values: List<TemporalAggregationFormatted>; - +value: TemporalAggregation; - +string: String; - +icon: IconData?; - +hashCode: int + <static>+kDefaultEnrollmentType: Participation; + +enrollmentType: Participation; + +questionnaireFormData: QuestionnaireFormData; + +consentItemsFormData: List<ConsentItemFormData>?; + +id: String | - +bool ==(); - +String toString(); - +String toJson(); - <static>+TemporalAggregationFormatted fromJson() + +Study apply(); + +EnrollmentFormData copy() ] - [TemporalAggregationFormatted]o-[TemporalAggregation] - [TemporalAggregationFormatted]o-[IconData] + [EnrollmentFormData]o-[Participation] + [EnrollmentFormData]o-[QuestionnaireFormData] + [<abstract>IStudyFormData]<:--[EnrollmentFormData] - [ImprovementDirectionFormatted + [ConsentItemFormViewModel | - -_value: ImprovementDirection; - <static>+values: List<ImprovementDirectionFormatted>; - +value: ImprovementDirection; - +string: String; - +icon: IconData?; - +hashCode: int + +consentIdControl: FormControl<String>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +iconControl: FormControl<IconOption>; + +form: FormGroup; + +consentId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +titles: Map<FormMode, String> | - +bool ==(); - +String toString(); - +String toJson(); - <static>+ImprovementDirectionFormatted fromJson() + +void setControlsFrom(); + +ConsentItemFormData buildFormData(); + +ConsentItemFormViewModel createDuplicate() ] - [ImprovementDirectionFormatted]o-[ImprovementDirection] - [ImprovementDirectionFormatted]o-[IconData] + [ConsentItemFormViewModel]o-[FormControl] + [ConsentItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] - [ReportSectionType + [<abstract>IScreenerQuestionLogicFormViewModel | - +index: int; - <static>+values: List<ReportSectionType>; - <static>+average: ReportSectionType; - <static>+linearRegression: ReportSectionType + +isDirtyOptionsBannerVisible: bool ] - [ReportSectionType]o-[ReportSectionType] - [Enum]<:--[ReportSectionType] - - [DataReferenceIdentifier + [ScreenerQuestionLogicFormView | - +hashCode: int + +formViewModel: ScreenerQuestionFormViewModel | - +bool ==() - ] - - [DataReference]<:-[DataReferenceIdentifier] - - [DataReferenceEditor - | - +formControl: FormControl<DataReferenceIdentifier<T>>; - +availableTasks: List<Task>; - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - | - +FormTableRow buildFormTableRow(); - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + +Widget build(); + -dynamic _buildInfoBanner(); + -dynamic _buildAnswerOptionsLogicControls(); + -List<Widget> _buildOptionLogicRow() ] - [DataReferenceEditor]o-[FormControl] - [DataReferenceEditor]o-[ReactiveDropdownField] + [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] + [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] - [AverageSectionFormView + [ScreenerQuestionFormViewModel | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + <static>+defaultResponseOptionValidity: bool; + +responseOptionsDisabledArray: FormArray<dynamic>; + +responseOptionsLogicControls: FormArray<bool>; + +responseOptionsLogicDescriptionControls: FormArray<String>; + -_questionBaseControls: Map<String, AbstractControl<dynamic>>; + +prevResponseOptionControls: List<AbstractControl<dynamic>>; + +prevResponseOptionValues: List<dynamic>; + +responseOptionsDisabledControls: List<AbstractControl<dynamic>>; + +logicControlOptions: List<FormControlOption<bool>>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isDirtyOptionsBannerVisible: bool | - +Widget build() + +dynamic onResponseOptionsChanged(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + -List<FormControl<dynamic>> _copyFormControls(); + -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); + -AbstractControl<dynamic>? _findAssociatedControlFor(); + +ScreenerQuestionFormViewModel createDuplicate() ] - [AverageSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[AverageSectionFormView] + [ScreenerQuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] + [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] - [LinearRegressionSectionFormView + [EnrollmentFormViewModel | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + +study: Study; + +router: GoRouter; + +consentItemDelegate: EnrollmentFormConsentItemDelegate; + +enrollmentTypeControl: FormControl<Participation>; + +consentItemArray: FormArray<dynamic>; + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +form: FormGroup; + +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; + +consentItemModels: List<ConsentItemFormViewModel>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titles: Map<FormMode, String>; + +canTestScreener: bool; + +canTestConsent: bool; + +questionTitles: Map<FormMode, String Function()> | - +Widget build() + +void setControlsFrom(); + +EnrollmentFormData buildFormData(); + +void read(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); + +dynamic testScreener(); + +dynamic testConsent(); + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() ] - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] + [EnrollmentFormViewModel]o-[Study] + [EnrollmentFormViewModel]o-[GoRouter] + [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] + [EnrollmentFormViewModel]o-[FormControl] + [EnrollmentFormViewModel]o-[FormArray] + [EnrollmentFormViewModel]o-[FormViewModelCollection] + [EnrollmentFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] + [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] + [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] - [ReportItemFormData + [EnrollmentFormConsentItemDelegate | - +isPrimary: bool; - +section: ReportSection; - +id: String + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +owner: EnrollmentFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic | - <static>+dynamic fromDomainModel(); - +ReportItemFormData copy() + +void onCancel(); + +dynamic onSave(); + +ConsentItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() ] - [ReportItemFormData]o-[<abstract>ReportSection] - [<abstract>IFormData]<:-[ReportItemFormData] + [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] + [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] - [ReportItemFormViewModel - | - <static>+defaultSectionType: ReportSectionType; - +sectionIdControl: FormControl<String>; - +sectionTypeControl: FormControl<ReportSectionType>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +sectionControl: FormControl<ReportSection>; - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; - +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; - +alphaControl: FormControl<double>; - -_controlsBySectionType: Map<ReportSectionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +sectionBaseControls: Map<String, AbstractControl<dynamic>>; - +form: FormGroup; - +sectionId: String; - +sectionType: ReportSectionType; - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +dataReferenceRequired: dynamic; - +aggregationRequired: dynamic; - +improvementDirectionRequired: dynamic; - +alphaConfidenceRequired: dynamic + [ConsentItemFormView | - -List<FormControlValidation> _getValidationConfig(); - +ReportItemFormData buildFormData(); - +ReportItemFormViewModel createDuplicate(); - +dynamic onSectionTypeChanged(); - -void _updateFormControls(); - +void setControlsFrom() + +formViewModel: ConsentItemFormViewModel ] - [ReportItemFormViewModel]o-[ReportSectionType] - [ReportItemFormViewModel]o-[FormControl] - [ReportItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] + [ConsentItemFormView]o-[ConsentItemFormViewModel] - [ReportsFormData + [<abstract>WithScheduleControls | - +reportItems: List<ReportItemFormData>; - +id: String + +isTimeRestrictedControl: FormControl<bool>; + +instanceID: FormControl<String>; + +restrictedTimeStartControl: FormControl<Time>; + +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; + +restrictedTimeEndControl: FormControl<Time>; + +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; + +hasReminderControl: FormControl<bool>; + +reminderTimeControl: FormControl<Time>; + +reminderTimePickerControl: FormControl<TimeOfDay>; + -_reminderControlStream: StreamSubscription<dynamic>?; + +scheduleFormControls: Map<String, FormControl<Object>>; + +hasReminder: bool; + +isTimeRestricted: bool; + +timeRestriction: List<Time>? | - +Study apply(); - +ReportsFormData copy() + +void setScheduleControlsFrom(); + -dynamic _initReminderControl() ] - [<abstract>IStudyFormData]<:--[ReportsFormData] + [<abstract>WithScheduleControls]o-[FormControl] + [<abstract>WithScheduleControls]o-[StreamSubscription] - [ReportStatus + [<abstract>IFormDataWithSchedule | - +index: int; - <static>+values: List<ReportStatus>; - <static>+primary: ReportStatus; - <static>+secondary: ReportStatus + +instanceId: String; + +isTimeLocked: bool; + +timeLockStart: StudyUTimeOfDay?; + +timeLockEnd: StudyUTimeOfDay?; + +hasReminder: bool; + +reminderTime: StudyUTimeOfDay? + | + +Schedule toSchedule() ] - [ReportStatus]o-[ReportStatus] - [Enum]<:--[ReportStatus] + [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] + [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] - [ReportBadge + [ScheduleControls | - +status: ReportStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool + +formViewModel: WithScheduleControls | - +Widget build() + +Widget build(); + -List<FormTableRow> _conditionalTimeRestrictions() ] - [ReportBadge]o-[ReportStatus] - [ReportBadge]o-[BadgeType] + [ScheduleControls]o-[<abstract>WithScheduleControls] + [<abstract>FormConsumerWidget]<:-[ScheduleControls] - [AppStatus + [SurveyQuestionType | +index: int; - <static>+values: List<AppStatus>; - <static>+initializing: AppStatus; - <static>+initialized: AppStatus + <static>+values: List<SurveyQuestionType>; + <static>+choice: SurveyQuestionType; + <static>+bool: SurveyQuestionType; + <static>+scale: SurveyQuestionType ] - [AppStatus]o-[AppStatus] - [Enum]<:--[AppStatus] + [SurveyQuestionType]o-[SurveyQuestionType] + [Enum]<:--[SurveyQuestionType] - [PublishDialog + [ChoiceQuestionFormView + | + +formViewModel: QuestionFormViewModel | +Widget build() ] - [<abstract>StudyPageWidget]<:-[PublishDialog] + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - [PublishConfirmationDialog + [BoolQuestionFormView + | + +formViewModel: QuestionFormViewModel | +Widget build() ] - [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - [PublishSuccessDialog + [<abstract>IScaleQuestionFormViewModel | - +Widget build() + +isMidValuesClearedInfoVisible: bool ] - [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] - - [StudyAnalyzeScreen + [ScaleQuestionFormView | - +Widget? banner(); - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] - - [StudyAnalyzeController - | - +dynamic onExport() - ] - - [StudyBaseController]<:-[StudyAnalyzeController] - - [StudyBaseController - | - +studyId: String; - +studyRepository: IStudyRepository; - +router: GoRouter; - +studySubscription: StreamSubscription<WrappedModel<Study>>? - | - +dynamic subscribeStudy(); - +dynamic onStudySubscriptionUpdate(); - +dynamic onStudySubscriptionError(); - +void dispose() - ] - - [StudyBaseController]o-[<abstract>IStudyRepository] - [StudyBaseController]o-[GoRouter] - [StudyBaseController]o-[StreamSubscription] - - [StudyParticipationBadge - | - +participation: Participation; - +type: BadgeType; - +showPrefixIcon: bool - | - +Widget build() + +formViewModel: QuestionFormViewModel ] - [StudyParticipationBadge]o-[Participation] - [StudyParticipationBadge]o-[BadgeType] - - [RouteInformation - | - +route: String?; - +extra: String?; - +cmd: String?; - +data: String? - | - +String toString() - ] + [ScaleQuestionFormView]o-[QuestionFormViewModel] - [<abstract>PlatformController + [<abstract>QuestionFormData | - +studyId: String; - +baseSrc: String; - +previewSrc: String; - +routeInformation: RouteInformation; - +frameWidget: Widget + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; + +questionId: String; + +questionText: String; + +questionInfoText: String?; + +questionType: SurveyQuestionType; + +responseOptionsValidity: Map<dynamic, bool>; + +responseOptions: List<dynamic>; + +id: String | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void listen(); - +void send(); - +void openNewPage() + +Question<dynamic> toQuestion(); + +EligibilityCriterion toEligibilityCriterion(); + +Answer<dynamic> constructAnswerFor(); + +dynamic setResponseOptionsValidityFrom(); + +QuestionFormData copy() ] - [<abstract>PlatformController]o-[RouteInformation] - [<abstract>PlatformController]o-[<abstract>Widget] + [<abstract>QuestionFormData]o-[SurveyQuestionType] + [<abstract>IFormData]<:--[<abstract>QuestionFormData] - [WebController - | - +iFrameElement: IFrameElement + [ChoiceQuestionFormData | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void openNewPage(); - +void listen(); - +void send() - ] - - [WebController]o-[IFrameElement] - [<abstract>PlatformController]<:-[WebController] - - [MobileController + +isMultipleChoice: bool; + +answerOptions: List<String>; + +responseOptions: List<String> | - +void openNewPage(); - +void refresh(); - +void registerViews(); - +void listen(); - +void send(); - +void navigate(); - +void activate(); - +void generateUrl() + +Question<dynamic> toQuestion(); + +QuestionFormData copy(); + -Choice _buildChoiceForValue(); + +Answer<dynamic> constructAnswerFor() ] - [<abstract>PlatformController]<:-[MobileController] + [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] - [<abstract>IStudyAppBarViewModel + [BoolQuestionFormData | - +isSyncIndicatorVisible: bool; - +isStatusBadgeVisible: bool; - +isPublishVisible: bool - ] - - [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] - [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] - - [StudyScaffold + <static>+kResponseOptions: Map<String, bool>; + +responseOptions: List<String> | - +studyId: String; - +tabs: List<NavbarTab>?; - +tabsSubnav: List<NavbarTab>?; - +selectedTab: NavbarTab?; - +selectedTabSubnav: NavbarTab?; - +body: StudyPageWidget; - +drawer: Widget?; - +disableActions: bool; - +actionsSpacing: double; - +actionsPadding: double; - +layoutType: SingleColumnLayoutType?; - +appbarHeight: double; - +appbarSubnavHeight: double + +Question<dynamic> toQuestion(); + +BoolQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [StudyScaffold]o-[NavbarTab] - [StudyScaffold]o-[<abstract>StudyPageWidget] - [StudyScaffold]o-[<abstract>Widget] - [StudyScaffold]o-[SingleColumnLayoutType] + [<abstract>QuestionFormData]<:-[BoolQuestionFormData] - [StudyController - | - +notificationService: INotificationService; - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; - +studyActions: List<ModelAction<dynamic>> + [ScaleQuestionFormData | - +dynamic syncStudyStatus(); - +dynamic onStudySubscriptionUpdate(); - -dynamic _redirectNewToActualStudyID(); - +dynamic publishStudy(); - +void onChangeStudyParticipation(); - +void onAddParticipants(); - +void onSettingsPressed(); - +void dispose() - ] - - [StudyController]o-[<abstract>INotificationService] - [StudyController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyController] - - [<abstract>IStudyStatusBadgeViewModel + +minValue: double; + +maxValue: double; + +minLabel: String?; + +maxLabel: String?; + +midValues: List<double?>; + +midLabels: List<String?>; + +stepSize: double; + +initialValue: double?; + +minColor: Color?; + +maxColor: Color?; + +responseOptions: List<double>; + +midAnnotations: List<Annotation> | - +studyParticipation: Participation?; - +studyStatus: StudyStatus? + +ScaleQuestion toQuestion(); + +QuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [<abstract>IStudyStatusBadgeViewModel]o-[Participation] - [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] + [ScaleQuestionFormData]o-[Color] + [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] - [StudyStatusBadge + [QuestionFormViewModel | - +participation: Participation?; - +status: StudyStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool + <static>+defaultQuestionType: SurveyQuestionType; + -_titles: Map<FormMode, String Function()>?; + +questionIdControl: FormControl<String>; + +questionTypeControl: FormControl<SurveyQuestionType>; + +questionTextControl: FormControl<String>; + +questionInfoTextControl: FormControl<String>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isMultipleChoiceControl: FormControl<bool>; + +choiceResponseOptionsArray: FormArray<dynamic>; + +customOptionsMin: int; + +customOptionsMax: int; + +customOptionsInitial: int; + +boolResponseOptionsArray: FormArray<String>; + <static>+kDefaultScaleMinValue: int; + <static>+kDefaultScaleMaxValue: int; + <static>+kNumMidValueControls: int; + <static>+kMidValueDebounceMilliseconds: int; + +scaleMinValueControl: FormControl<int>; + +scaleMaxValueControl: FormControl<int>; + -_scaleRangeControl: FormControl<int>; + +scaleMinLabelControl: FormControl<String>; + +scaleMaxLabelControl: FormControl<String>; + +scaleMidValueControls: FormArray<int>; + +scaleMidLabelControls: FormArray<String?>; + -_scaleResponseOptionsArray: FormArray<int>; + +scaleMinColorControl: FormControl<SerializableColor>; + +scaleMaxColorControl: FormControl<SerializableColor>; + +prevMidValues: List<int?>?; + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +form: FormGroup; + +questionId: String; + +questionType: SurveyQuestionType; + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; + +answerOptionsArray: FormArray<dynamic>; + +answerOptionsControls: List<AbstractControl<dynamic>>; + +validAnswerOptions: List<String>; + +boolOptions: List<AbstractControl<String>>; + +scaleMinValue: int; + +scaleMaxValue: int; + +scaleRange: int; + +scaleAllValueControls: List<AbstractControl<int>>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +questionTextRequired: dynamic; + +numValidChoiceOptions: dynamic; + +scaleRangeValid: dynamic; + +titles: Map<FormMode, String>; + +isAddOptionButtonVisible: bool; + +isMidValuesClearedInfoVisible: bool | - +Widget build() + +String? scaleMidLabelAt(); + -dynamic _onScaleRangeChanged(); + -dynamic _applyInputFormatters(); + -dynamic _updateScaleMidValueControls(); + -List<FormControlValidation> _getValidationConfig(); + +dynamic onQuestionTypeChanged(); + +dynamic onResponseOptionsChanged(); + -void _updateFormControls(); + +void initControls(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem(); + +QuestionFormViewModel createDuplicate() ] - [StudyStatusBadge]o-[Participation] - [StudyStatusBadge]o-[StudyStatus] - [StudyStatusBadge]o-[BadgeType] + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - [StudyTestController + [SurveyQuestionFormView | - +authRepository: IAuthRepository; - +languageCode: String + +formViewModel: QuestionFormViewModel; + +isHtmlStyleable: bool ] - [StudyTestController]o-[<abstract>IAuthRepository] - [StudyBaseController]<:-[StudyTestController] + [SurveyQuestionFormView]o-[QuestionFormViewModel] - [TestAppRoutes + [<abstract>WithQuestionnaireControls | - <static>+studyOverview: String; - <static>+eligibility: String; - <static>+intervention: String; - <static>+consent: String; - <static>+journey: String; - <static>+dashboard: String - ] - - [<abstract>IStudyNavViewModel + +questionsArray: FormArray<dynamic>; + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; + +questionnaireControls: Map<String, FormArray<dynamic>>; + +propagateOnSave: bool; + +questionModels: List<Q>; + +questionTitles: Map<FormMode, String Function()> | - +isEditTabEnabled: bool; - +isTestTabEnabled: bool; - +isRecruitTabEnabled: bool; - +isMonitorTabEnabled: bool; - +isAnalyzeTabEnabled: bool; - +isSettingsEnabled: bool + +void setQuestionnaireControlsFrom(); + +QuestionnaireFormData buildQuestionnaireFormData(); + +void read(); + +void onCancel(); + +dynamic onSave(); + +Q provide(); + +Q provideQuestionFormViewModel() ] - [StudyNav - | - <static>+dynamic tabs(); - <static>+dynamic edit(); - <static>+dynamic test(); - <static>+dynamic recruit(); - <static>+dynamic monitor(); - <static>+dynamic analyze() - ] + [<abstract>WithQuestionnaireControls]o-[FormArray] + [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] + [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] + [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - [StudyDesignNav + [QuestionnaireFormData | - <static>+dynamic tabs(); - <static>+dynamic info(); - <static>+dynamic enrollment(); - <static>+dynamic interventions(); - <static>+dynamic measurements(); - <static>+dynamic reports() + +questionsData: List<QuestionFormData>?; + +id: String + | + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() ] - [StudySettingsDialog + [<abstract>IFormData]<:--[QuestionnaireFormData] + + [<abstract>StudyDesignPageWidget | - +Widget build() + +Widget? banner() ] - [<abstract>StudyPageWidget]<:-[StudySettingsDialog] + [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] - [StudySettingsFormViewModel + [StudyFormViewModel | - +study: AsyncValue<Study>; + +studyDirtyCopy: Study?; +studyRepository: IStudyRepository; - <static>+defaultPublishedToRegistry: bool; - <static>+defaultPublishedToRegistryResults: bool; - +isPublishedToRegistryControl: FormControl<bool>; - +isPublishedToRegistryResultsControl: FormControl<bool>; + +authRepository: IAuthRepository; + +router: GoRouter; + +studyInfoFormViewModel: StudyInfoFormViewModel; + +enrollmentFormViewModel: EnrollmentFormViewModel; + +measurementsFormViewModel: MeasurementsFormViewModel; + +reportsFormViewModel: ReportsFormViewModel; + +interventionsFormViewModel: InterventionsFormViewModel; +form: FormGroup; + +isStudyReadonly: bool; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; +titles: Map<FormMode, String> | + +void read(); +void setControlsFrom(); +Study buildFormData(); - +dynamic keepControlsSynced(); - +dynamic save(); - +dynamic setLaunchDefaults() - ] - - [StudySettingsFormViewModel]o-[<abstract>AsyncValue] - [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] - [StudySettingsFormViewModel]o-[FormControl] - [StudySettingsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] - - [<abstract>StudyPageWidget - | - +studyId: String - | - +Widget? banner() + +void dispose(); + +void onCancel(); + +dynamic onSave(); + -dynamic _applyAndSaveSubform() ] - [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] - [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] + [StudyFormViewModel]o-[Study] + [StudyFormViewModel]o-[<abstract>IStudyRepository] + [StudyFormViewModel]o-[<abstract>IAuthRepository] + [StudyFormViewModel]o-[GoRouter] + [StudyFormViewModel]o-[StudyInfoFormViewModel] + [StudyFormViewModel]o-[EnrollmentFormViewModel] + [StudyFormViewModel]o-[MeasurementsFormViewModel] + [StudyFormViewModel]o-[ReportsFormViewModel] + [StudyFormViewModel]o-[InterventionsFormViewModel] + [StudyFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] - [StudyTestScreen + [<abstract>StudyScheduleControls | - +previewRoute: String? + <static>+defaultScheduleType: PhaseSequence; + <static>+defaultScheduleTypeSequence: String; + <static>+defaultNumCycles: int; + <static>+defaultPeriodLength: int; + +sequenceTypeControl: FormControl<PhaseSequence>; + +sequenceTypeCustomControl: FormControl<String>; + +phaseDurationControl: FormControl<int>; + +numCyclesControl: FormControl<int>; + +includeBaselineControl: FormControl<bool>; + +studyScheduleControls: Map<String, FormControl<Object>>; + <static>+kNumCyclesMin: int; + <static>+kNumCyclesMax: int; + <static>+kPhaseDurationMin: int; + <static>+kPhaseDurationMax: int; + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +numCyclesRange: dynamic; + +phaseDurationRange: dynamic; + +customSequenceRequired: dynamic | - +Widget build(); - +Widget? banner(); - +dynamic load(); - +dynamic save(); - +dynamic showHelp() + +void setStudyScheduleControlsFrom(); + +StudyScheduleFormData buildStudyScheduleFormData(); + +bool isSequencingCustom() ] - [<abstract>StudyPageWidget]<:-[StudyTestScreen] + [<abstract>StudyScheduleControls]o-[PhaseSequence] + [<abstract>StudyScheduleControls]o-[FormControl] - [FrameControlsWidget - | - +onRefresh: void Function()?; - +onOpenNewTab: void Function()?; - +enabled: bool + [StudyDesignInterventionsFormView | +Widget build() ] - [FrameControlsWidget]o-[void Function()?] - [<abstract>ConsumerWidget]<:-[FrameControlsWidget] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] - [PreviewFrame + [InterventionFormViewModel | - +studyId: String; - +routeArgs: StudyFormRouteArgs?; - +route: String? + +study: Study; + +interventionIdControl: FormControl<String>; + +interventionTitleControl: FormControl<String>; + +interventionIconControl: FormControl<IconOption>; + +interventionDescriptionControl: FormControl<String>; + +interventionTasksArray: FormArray<dynamic>; + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; + +form: FormGroup; + +interventionId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +atLeastOneTask: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> + | + +void setControlsFrom(); + +InterventionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +void onCancel(); + +dynamic onSave(); + +InterventionTaskFormViewModel provide(); + +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); + +InterventionTaskFormRouteArgs buildFormRouteArgs(); + +InterventionFormViewModel createDuplicate() ] - [PreviewFrame]o-[<abstract>StudyFormRouteArgs] + [InterventionFormViewModel]o-[Study] + [InterventionFormViewModel]o-[FormControl] + [InterventionFormViewModel]o-[FormArray] + [InterventionFormViewModel]o-[FormViewModelCollection] + [InterventionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] + [<abstract>IListActionProvider]<:--[InterventionFormViewModel] + [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] - [WebFrame + [StudyScheduleFormView | - +previewSrc: String; - +studyId: String + +formViewModel: StudyScheduleControls | + -FormTableRow _renderCustomSequence(); +Widget build() ] - [DisabledFrame - | - +Widget build() - ] + [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] + [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] - [PhoneContainer + [StudyScheduleFormData | - <static>+defaultWidth: double; - <static>+defaultHeight: double; - +width: double; - +height: double; - +borderColor: Color; - +borderWidth: double; - +borderRadius: double; - +innerContent: Widget; - +innerContentBackgroundColor: Color? + +sequenceType: PhaseSequence; + +sequenceTypeCustom: String; + +numCycles: int; + +phaseDuration: int; + +includeBaseline: bool; + +id: String | - +Widget build() + +StudySchedule toStudySchedule(); + +Study apply(); + +StudyScheduleFormData copy() ] - [PhoneContainer]o-[Color] - [PhoneContainer]o-[<abstract>Widget] + [StudyScheduleFormData]o-[PhaseSequence] + [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - [MobileFrame + [InterventionFormView | - +Widget build() + +formViewModel: InterventionFormViewModel ] - [DesktopFrame + [InterventionFormView]o-[InterventionFormViewModel] + + [InterventionsFormViewModel | - +Widget build() + +study: Study; + +router: GoRouter; + +interventionsArray: FormArray<dynamic>; + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; + +form: FormGroup; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +interventionsRequired: dynamic; + +titles: Map<FormMode, String>; + +canTestStudySchedule: bool + | + +void setControlsFrom(); + +InterventionsFormData buildFormData(); + +void read(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +InterventionFormViewModel provide(); + +void onCancel(); + +dynamic onSave(); + +dynamic testStudySchedule() ] - [StudiesFilter + [InterventionsFormViewModel]o-[Study] + [InterventionsFormViewModel]o-[GoRouter] + [InterventionsFormViewModel]o-[FormArray] + [InterventionsFormViewModel]o-[FormViewModelCollection] + [InterventionsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InterventionsFormViewModel] + [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] + [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] + + [InterventionTaskFormData | - +index: int; - <static>+values: List<StudiesFilter> + +taskId: String; + +taskTitle: String; + +taskDescription: String?; + <static>+kDefaultTitle: String; + +id: String + | + +CheckmarkTask toTask(); + +InterventionTaskFormData copy() ] - [Enum]<:--[StudiesFilter] + [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] - [DashboardScaffold + [InterventionPreview | - +body: Widget + +routeArgs: InterventionFormRouteArgs | +Widget build() ] - [DashboardScaffold]o-[<abstract>Widget] - - [StudiesTable - | - +studies: List<Study>; - +onSelect: void Function(Study); - +getActions: List<ModelAction<dynamic>> Function(Study); - +emptyWidget: Widget + [InterventionPreview]o-[InterventionFormRouteArgs] + [<abstract>ConsumerWidget]<:-[InterventionPreview] + + [InterventionTaskFormView | - +Widget build(); - -List<Widget> _buildRow() + +formViewModel: InterventionTaskFormViewModel ] - [StudiesTable]o-[void Function(Study)] - [StudiesTable]o-[List<ModelAction<dynamic>> Function(Study)] - [StudiesTable]o-[<abstract>Widget] + [InterventionTaskFormView]o-[InterventionTaskFormViewModel] - [DashboardScreen + [InterventionsFormData | - +filter: StudiesFilter? + +interventionsData: List<InterventionFormData>; + +studyScheduleData: StudyScheduleFormData; + +id: String + | + +Study apply(); + +InterventionsFormData copy() ] - [DashboardScreen]o-[StudiesFilter] + [InterventionsFormData]o-[StudyScheduleFormData] + [<abstract>IStudyFormData]<:--[InterventionsFormData] - [DashboardController + [InterventionTaskFormViewModel | - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +router: GoRouter; - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + +taskIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +taskTitleControl: FormControl<String>; + +taskDescriptionControl: FormControl<String>; + +markAsCompletedControl: FormControl<bool>; + +form: FormGroup; + +taskId: String; + +instanceId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +titles: Map<FormMode, String> | - -dynamic _subscribeStudies(); - +dynamic setStudiesFilter(); - +dynamic onSelectStudy(); - +dynamic onClickNewStudy(); - +List<ModelAction<dynamic>> availableActions(); - +void dispose() + +void setControlsFrom(); + +InterventionTaskFormData buildFormData(); + +InterventionTaskFormViewModel createDuplicate() ] - [DashboardController]o-[<abstract>IStudyRepository] - [DashboardController]o-[<abstract>IAuthRepository] - [DashboardController]o-[GoRouter] - [DashboardController]o-[StreamSubscription] - [<abstract>IModelActionProvider]<:--[DashboardController] + [InterventionTaskFormViewModel]o-[FormControl] + [InterventionTaskFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] + [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] - [StudyMonitorScreen + [InterventionFormData | - +Widget build() + +interventionId: String; + +title: String; + +description: String?; + +tasksData: List<InterventionTaskFormData>?; + +iconName: String?; + <static>+kDefaultTitle: String; + +id: String + | + +Intervention toIntervention(); + +InterventionFormData copy() ] - [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] + [<abstract>IFormData]<:-[InterventionFormData] [AccountSettingsDialog | @@ -2200,1556 +2193,1685 @@ [<abstract>ConsumerWidget]<:-[AccountSettingsDialog] - [App + [AppStatus + | + +index: int; + <static>+values: List<AppStatus>; + <static>+initializing: AppStatus; + <static>+initialized: AppStatus ] - [AppContent + [AppStatus]o-[AppStatus] + [Enum]<:--[AppStatus] + + [<abstract>IAppDelegate + | + +dynamic onAppStart() + ] + + [AppController + | + +sharedPreferences: SharedPreferences; + +appDelegates: List<IAppDelegate>; + -_delayedFuture: dynamic; + +isInitialized: dynamic + | + +dynamic onAppStart(); + -dynamic _callDelegates() ] + [AppController]o-[SharedPreferences] + - + - + - - + + - - - - - - + - - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - - - + + - + + - + - + - + - - - - + + + - - - + + + - - + - + - - - + - + + + + - + + - + - + + + - + - + - + - + - + + + - - - - - - + + - + - - + + - + - + + + - + - + - + - + - + - + - + - - - + - + - - - + + - + + - + - - - + + - - - - - + + + + + - - - + + - + - - - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + + - - + - + - - + + + - - + - + - + - + - + - + - + + + - + - - - - - + + + + + - + - + - + - - + + - + - - + + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + + + - + - + + + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + + - + - - - + - - + + - + - + - + - + - + + + + + + + + + + + + + - + - - - - - - + + + - + + - + - - - + - + - - - + - + - - - - + + + - - + - + - + - + - + - + + + + + + - + + - + - + - + - + - + - + - + - - - - - - + + + - - - + + + - - - + + + + + + + - - + - + - + - + - - + + + + + + + - - - + + + - - - + + + - - - - + - + - - + + + + + + + - - + - + - + - + - - - - - + - + - + - + - - + + + - - + + + - + - + - + - + + + + + - + - + - + - + - + - + + + - + - - - - - + - + - + - - - + + + + - - - - + - + + + + + + - - - + + + + - + - + - + - + - + - + - + - + - + + + + + + - - + - + - + - + - + - + - - + + - + - + - + - - - - - + - + - - + + + + + + - - - - - - + + - + - + - + - - - - + + - + - + + + - + - + + + - + + + + - - - + + - + - + - + - + - + - + - + - + - + - - - - + + + - + + - + - + - - - - - - - - - - - - - - - - - - + - + + - + - + - + - - - - - - - + - + - + - + - + - - + + - + - - - - + + + - - - + + + + + + + + + + + + + + + - - - - + - + - + - + - - - + - + - + - + - + - + - + - - + + - + - - - + + + - + - + - + - + - + - + + + - + - - + + - + - - + + - + - + - - - - - - + + + + - + - - - + - + - + + + + + - - - - + - - + - + - - - - - + + - - - + + - + - - + + + - - + + + - + - + + + - + + + - + - - - + + + + - - - - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + - - + - + - + - + - - + + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - - - + + - + + - + - + + + - + - + - - - - + + - + - + + + - + - + + + - + - - - + - + - - - - - + + - - - + + + + + + - + - + + + - + - + - + - - - - + + + - - + - + + + - + - - + + - + - + - + - + - + + + + + + + + + - + - - - - - - - - - - - - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - + + + + + + + - + + - + - - + + - + - + - + - + + + - + - + - + - + - + - + - + - - - + - + - - - + + + + + + + + + + + + - + + - + - + + + - + + + + - + + - + - + - + - - - - - + - + - + - + - + - + - + - + - - - - + + + + - + - - - - - - + + + + + + + - - - + + + + - + - + + + - + - + - + - + - - + + - + - + - + - + + + + + + + + + - + - - - + + - + + - + - - - + + + + + + + + + DrawerEntry + + + + + + +localizedTitle: String Function() + +icon: IconData? + +localizedHelpText: String Function()? + +enabled: bool + +onSelected: void Function(BuildContext, WidgetRef)? + +title: String + +helpText: String? + + + + + + +void onClick() + + + - - - + + + + + + + String Function() + + + - - - + + + + + + + IconData + + + - - - + + + + + + + String Function()? + + + - - + + + + + + + void Function(BuildContext, WidgetRef)? + + + - - - - - - - - + + + + + - - - FormValidationSetEnum + + + GoRouterDrawerEntry + + + + + + +intent: RoutingIntent + + + + + + +void onClick() - - - - - + + + - - - FormControlValidation + + + RoutingIntent - - - +control: AbstractControl<dynamic> - +validators: List<Validator<dynamic>> - +asyncValidators: List<AsyncValidator<dynamic>>? - +validationMessages: Map<String, String Function(Object)> + + + + + + + + + AppDrawer - - - +FormControlValidation merge() + + + +title: String + +width: int + +leftPaddingEntries: double + +logoPaddingVertical: double + +logoPaddingHorizontal: double + +logoMaxHeight: double + +logoSectionMinHeight: double + +logoSectionMaxHeight: double - - - + + + + + - - - AbstractControl + + + DashboardController + + + + + + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +userRepository: IUserRepository + +router: GoRouter + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + +searchController: SearchController + + + + + + -dynamic _subscribeStudies() + +dynamic setSearchText() + +dynamic setStudiesFilter() + +dynamic onSelectStudy() + +dynamic onClickNewStudy() + +dynamic pinStudy() + +dynamic pinOffStudy() + +void filterStudies() + +void sortStudies() + +bool isPinned() + +List<ModelAction<dynamic>> availableActions() + +void dispose() - - - - + + + - - - ManagedFormViewModel + + + IStudyRepository - - - +ManagedFormViewModel<T> createDuplicate() + + + + + + + + IAuthRepository - - - - - + + + - - - FormViewModel + + + IUserRepository - - - -_formData: T? - -_formMode: FormMode - -_validationSet: FormValidationSetEnum? - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? - +autosave: bool - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> - -_immediateFormChildrenListenerDebouncer: Debouncer? - -_autosaveOperation: CancelableOperation<dynamic>? - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> - +prevFormValue: Map<String, dynamic>? - <static>-_formKey: String - +formData: T? - +formMode: FormMode - +isReadonly: bool - +validationSet: FormValidationSetEnum? - +isDirty: bool - +title: String - +isValid: bool - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + + + + + + + + GoRouter - - - -dynamic _setFormData() - -dynamic _rememberDefaultControlValidators() - -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() - -dynamic _disableAllControls() - -dynamic _formModeUpdated() - -dynamic _restoreControlsFromFormData() - +void revalidate() - -void _applyValidationSet() - +void read() - +dynamic save() - +dynamic cancel() - +void enableAutosave() - +void listenToImmediateFormChildren() - +dynamic markFormGroupChanged() - +void dispose() - +void setControlsFrom() - +T buildFormData() - +void initControls() + + + + + + + + StreamSubscription - - - + + + - - - FormViewModelNotFoundException + + + SearchController - - - + + + - - - Exception + + + IModelActionProvider - - - - - + + + + + - - - FormViewModelCollection + + + StudiesTable - - - +formViewModels: List<T> - +formArray: FormArray<dynamic> - +stagedViewModels: List<T> - +retrievableViewModels: List<T> - +formData: List<D> + + + +studies: List<Study> + +onSelect: void Function(Study) + +getActions: List<ModelAction<dynamic>> Function(Study) + +emptyWidget: Widget + +pinnedStudies: Iterable<String> + +dashboardController: DashboardController + +pinnedPredicates: int Function(Study, Study) + -_sortColumns: List<int Function(Study, Study)?> - - - +void add() - +T remove() - +T? findWhere() - +T? removeWhere() - +bool contains() - +void stage() - +T commit() - +void reset() - +void read() + + + +Widget build() + -List<Widget> _buildRow() - - - + + + - - - FormArray + + + void Function(Study) - - - - - + + + - - - FormArrayTable + + + List<ModelAction<dynamic>> Function(Study) - - - +control: AbstractControl<dynamic> - +items: List<T> - +onSelectItem: void Function(T) - +getActionsAt: List<ModelAction<dynamic>> Function(T, int) - +onNewItem: void Function()? - +rowTitle: String Function(T) - +onNewItemLabel: String - +sectionTitle: String? - +sectionDescription: String? - +emptyIcon: IconData? - +emptyTitle: String? - +emptyDescription: String? - +sectionTitleDivider: bool? - +rowPrefix: Widget Function(BuildContext, T, int)? - +rowSuffix: Widget Function(BuildContext, T, int)? - +leadingWidget: Widget? - +itemsSectionPadding: EdgeInsets? - +hideLeadingTrailingWhenEmpty: bool - <static>+columns: List<StandardTableColumn> + + + + + + + + Widget - - - +Widget build() - -List<Widget> _buildRow() - -Widget _newItemButton() + + + + + + + + int Function(Study, Study) - - - + + + + + + + + + DashboardScaffold + + + + + + +body: Widget + + - - - void Function(T) + + + +Widget build() - - - + + + + - - - List<ModelAction<dynamic>> Function(T, int) + + + StudiesFilter - - - - - - - - void Function()? + + + +index: int + <static>+values: List<StudiesFilter> - - - + + + - - - String Function(T) + + + Enum - - - + + + + - - - IconData + + + DashboardScreen - - - - - - - - Widget Function(BuildContext, T, int)? + + + +filter: StudiesFilter? - - - + + + + - - - Widget + + + StudyMonitorScreen - - - - - - - - EdgeInsets + + + +Widget build() - - - - - + + + + + - - - IFormData + + + StudyPageWidget - - - +id: String + + + +studyId: String - - - +IFormData copy() + + + +Widget? banner() - - - + + + - + CustomFormControl - + -_onValueChangedDebouncer: Debouncer? -_onStatusChangedDebouncer: Debouncer? @@ -3760,7 +3882,7 @@ - + +void dispose() @@ -3769,9 +3891,9 @@ - + - + Debouncer @@ -3780,9 +3902,9 @@ - + - + void Function(T?)? @@ -3791,9 +3913,9 @@ - + - + void Function(ControlStatus)? @@ -3802,9 +3924,9 @@ - + - + FormControl @@ -3813,27 +3935,38 @@ - + - + FormInvalidException + + + + + + + Exception + + + + - - + + - + FormConfigException - + +message: String? @@ -3842,16 +3975,16 @@ - - + + - + IFormViewModelDelegate - + +dynamic onSave() +void onCancel() @@ -3861,16 +3994,16 @@ - - + + - + IFormGroupController - + +form: FormGroup @@ -3879,9 +4012,9 @@ - + - + FormGroup @@ -3890,16 +4023,16 @@ - - + + - + FormControlOption - + +value: T +label: String @@ -3908,612 +4041,406 @@ - - - - - - - - Equatable - - - - - - - - - - - - FormMode - - - - - - +index: int - <static>+values: List<FormMode> - <static>+create: FormMode - <static>+readonly: FormMode - <static>+edit: FormMode - - - - - - - - - - - CancelableOperation - - - - - - - - - - - Enum - - - - - - - - - - - - UnsavedChangesDialog - - - - - - +Widget build() - - - - - - - - - - - - - DrawerEntry - - - - - - +localizedTitle: String Function() - +icon: IconData? - +localizedHelpText: String Function()? - +enabled: bool - +onSelected: void Function(BuildContext, WidgetRef)? - +title: String - +helpText: String? - - - - - - +void onClick() - - - - - - - - - - - String Function() - - - - - - - - - - - String Function()? - - - - - - - - - - - void Function(BuildContext, WidgetRef)? - - - - - - - - - - - - - GoRouterDrawerEntry - - - - - - +intent: RoutingIntent - - - - - - +void onClick() - - - - - - - - - - - RoutingIntent - - - - - - - - - - - - AppDrawer - - - - - - +title: String - +width: int - +leftPaddingEntries: double - +logoPaddingVertical: double - +logoPaddingHorizontal: double - +logoMaxHeight: double - +logoSectionMinHeight: double - +logoSectionMaxHeight: double - - - - - - - - - - - - AuthScaffold - - - - - - +body: Widget - +formKey: AuthFormKey - +leftContentMinWidth: double - +leftPanelMinWidth: double - +leftPanelPadding: EdgeInsets + + + + + + + + Equatable - - - - + + + + + - - - AuthFormKey + + + FormViewModel - - - +index: int - <static>+values: List<AuthFormKey> - <static>+login: AuthFormKey - <static>+signup: AuthFormKey - <static>+passwordForgot: AuthFormKey - <static>+passwordRecovery: AuthFormKey - <static>-_loginSubmit: AuthFormKey - <static>-_signupSubmit: AuthFormKey + + + -_formData: T? + -_formMode: FormMode + -_validationSet: FormValidationSetEnum? + +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? + +autosave: bool + -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> + -_immediateFormChildrenListenerDebouncer: Debouncer? + -_autosaveOperation: CancelableOperation<dynamic>? + -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> + +prevFormValue: Map<String, dynamic>? + <static>-_formKey: String + +formData: T? + +formMode: FormMode + +isReadonly: bool + +validationSet: FormValidationSetEnum? + +isDirty: bool + +title: String + +isValid: bool + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + + + + + + -dynamic _setFormData() + -dynamic _rememberDefaultControlValidators() + -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() + -dynamic _disableAllControls() + -dynamic _formModeUpdated() + -dynamic _restoreControlsFromFormData() + +void revalidate() + -void _applyValidationSet() + +void read() + +dynamic save() + +dynamic cancel() + +void enableAutosave() + +void listenToImmediateFormChildren() + +dynamic markFormGroupChanged() + +void dispose() + +void setControlsFrom() + +T buildFormData() + +void initControls() - - - - - + + + + - - - PasswordRecoveryForm + + + FormMode - - - +formKey: AuthFormKey + + + +index: int + <static>+values: List<FormMode> + <static>+create: FormMode + <static>+readonly: FormMode + <static>+edit: FormMode - - - +Widget build() + + + + + + + + FormValidationSetEnum - - - + + + - - - FormConsumerRefWidget + + + CancelableOperation - - - - - + + + + - - - LoginForm + + + ManagedFormViewModel - - - +formKey: AuthFormKey + + + +ManagedFormViewModel<T> createDuplicate() - - - +Widget build() + + + + + + + + FormViewModelNotFoundException - - - - - + + + + + - - - SignupForm + + + FormViewModelCollection - - - +formKey: AuthFormKey + + + +formViewModels: List<T> + +formArray: FormArray<dynamic> + +stagedViewModels: List<T> + +retrievableViewModels: List<T> + +formData: List<D> - - - +Widget build() - -dynamic _onClickTermsOfUse() - -dynamic _onClickPrivacyPolicy() + + + +void add() + +T remove() + +T? findWhere() + +T? removeWhere() + +bool contains() + +void stage() + +T commit() + +void reset() + +void read() - - - - - + + + - - - PasswordForgotForm + + + FormArray - - - +formKey: AuthFormKey + + + + + + + + + UnsavedChangesDialog - - - +Widget build() + + + +Widget build() - - - - + + + + + - - - StudyUJobsToBeDone + + + IFormData - - - +Widget build() + + + +id: String - - - - - - - - - - AuthFormController + + + +IFormData copy() - - - +authRepository: IAuthRepository - +sharedPreferences: SharedPreferences - +notificationService: INotificationService - +router: GoRouter - +emailControl: FormControl<String> - +passwordControl: FormControl<String> - +passwordConfirmationControl: FormControl<String> - +rememberMeControl: FormControl<bool> - +termsOfServiceControl: FormControl<bool> - <static>+authValidationMessages: Map<String, String Function(dynamic)> - +loginForm: FormGroup - +signupForm: FormGroup - +passwordForgotForm: FormGroup - +passwordRecoveryForm: FormGroup - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> - -_formKey: AuthFormKey - +shouldRemember: bool - +formKey: AuthFormKey - +form: FormGroup + + + + + + + + + + FormArrayTable - - - -dynamic _onChangeFormKey() - +dynamic resetControlsFor() - -dynamic _forceValidationMessages() - +dynamic signUp() - -dynamic _signUp() - +dynamic signIn() - -dynamic _signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic sendPasswordResetLink() - +dynamic recoverPassword() - +dynamic updateUser() - -void _setRememberMe() - -void _delRememberMe() - -void _initRememberMe() + + + +control: AbstractControl<dynamic> + +items: List<T> + +onSelectItem: void Function(T) + +getActionsAt: List<ModelAction<dynamic>> Function(T, int) + +onNewItem: void Function()? + +rowTitle: String Function(T) + +onNewItemLabel: String + +sectionTitle: String? + +sectionDescription: String? + +emptyIcon: IconData? + +emptyTitle: String? + +emptyDescription: String? + +sectionTitleDivider: bool? + +rowPrefix: Widget Function(BuildContext, T, int)? + +rowSuffix: Widget Function(BuildContext, T, int)? + +leadingWidget: Widget? + +itemsSectionPadding: EdgeInsets? + +hideLeadingTrailingWhenEmpty: bool + <static>+columns: List<StandardTableColumn> - - - - - - - - IAuthRepository + + + +Widget build() + -List<Widget> _buildRow() + -Widget _newItemButton() - - - + + + - - - SharedPreferences + + + AbstractControl - - - + + + - - - INotificationService + + + void Function(T) - - - + + + - - - GoRouter + + + List<ModelAction<dynamic>> Function(T, int) - - - - - - - - EmailTextField - - + + + - - - +labelText: String - +hintText: String? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + void Function()? - - - - - - - - PasswordTextField - - + + + - - - +labelText: String - +hintText: String? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + String Function(T) - - - - - - - - IAppDelegate - - + + + - - - +dynamic onAppStart() + + + Widget Function(BuildContext, T, int)? - - - - - - - - - AppController - - - - - - +sharedPreferences: SharedPreferences - +appDelegates: List<IAppDelegate> - -_delayedFuture: dynamic - +isInitialized: dynamic - - + + + - - - +dynamic onAppStart() - -dynamic _callDelegates() + + + EdgeInsets - - - - - + + + + + - - - InviteCodeFormView + + + FormControlValidation - - - +formViewModel: InviteCodeFormViewModel + + + +control: AbstractControl<dynamic> + +validators: List<Validator<dynamic>> + +asyncValidators: List<AsyncValidator<dynamic>>? + +validationMessages: Map<String, String Function(Object)> - - - +Widget build() - -List<FormTableRow> _conditionalInterventionRows() + + + +FormControlValidation merge() - - - + + + - + InviteCodeFormViewModel - + +study: Study +inviteCodeRepository: IInviteCodeRepository @@ -4532,7 +4459,7 @@ - + +void initControls() -dynamic _uniqueInviteCode() @@ -4545,207 +4472,186 @@ - - - + + + - - - FormConsumerWidget + + + Study - - - - - - - - StudyRecruitScreen - - + + + - - - +Widget build() - -Widget _inviteCodesSectionHeader() - -Widget _newInviteCodeButton() - -dynamic _onSelectInvite() + + + IInviteCodeRepository - - - - - + + + + + - - - StudyPageWidget + + + EnrolledBadge - - - +studyId: String + + + +enrolledCount: int - - - +Widget? banner() + + + +Widget build() - - - - - + + + + + - - - StudyRecruitController + + + InviteCodeFormView - - - +inviteCodeRepository: IInviteCodeRepository - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + + + +formViewModel: InviteCodeFormViewModel - - - -dynamic _subscribeInvites() - +Intervention? getIntervention() - +int getParticipantCountForInvite() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void dispose() + + + +Widget build() + -List<FormTableRow> _conditionalInterventionRows() - - - + + + - - - IInviteCodeRepository + + + FormConsumerWidget - - - + + + + - - - StreamSubscription + + + StudyRecruitScreen - - - - - - - - - - StudyBaseController + + + +Widget build() + -Widget _inviteCodesSectionHeader() + -Widget _newInviteCodeButton() + -dynamic _onSelectInvite() - - - +studyId: String - +studyRepository: IStudyRepository - +router: GoRouter - +studySubscription: StreamSubscription<WrappedModel<Study>>? - - + + + + + + - - - +dynamic subscribeStudy() - +dynamic onStudySubscriptionUpdate() - +dynamic onStudySubscriptionError() - +void dispose() + + + StudyRecruitController - - - - - - - - IModelActionProvider + + + +inviteCodeRepository: IInviteCodeRepository + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - - - - - - - - Study + + + -dynamic _subscribeInvites() + +Intervention? getIntervention() + +int getParticipantCountForInvite() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void dispose() - - - - - + + + + + - - - EnrolledBadge + + + StudyBaseController - - - +enrolledCount: int + + + +studyId: String + +studyRepository: IStudyRepository + +router: GoRouter + +studySubscription: StreamSubscription<WrappedModel<Study>>? - - - +Widget build() + + + +dynamic subscribeStudy() + +dynamic onStudySubscriptionUpdate() + +dynamic onStudySubscriptionError() + +void dispose() - - - + + + - + StudyInvitesTable - + +invites: List<StudyInvite> +onSelect: void Function(StudyInvite) @@ -4756,7 +4662,7 @@ - + +Widget build() -List<Widget> _buildRow() @@ -4766,9 +4672,9 @@ - + - + void Function(StudyInvite) @@ -4777,9 +4683,9 @@ - + - + List<ModelAction<dynamic>> Function(StudyInvite) @@ -4788,9 +4694,9 @@ - + - + Intervention? Function(String) @@ -4799,1529 +4705,1364 @@ - + - + int Function(StudyInvite) - - - - - + + + + - - - StudyFormViewModel + + + AuthScaffold - - - +studyDirtyCopy: Study? - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +router: GoRouter - +studyInfoFormViewModel: StudyInfoFormViewModel - +enrollmentFormViewModel: EnrollmentFormViewModel - +measurementsFormViewModel: MeasurementsFormViewModel - +reportsFormViewModel: ReportsFormViewModel - +interventionsFormViewModel: InterventionsFormViewModel - +form: FormGroup - +isStudyReadonly: bool - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> + + + +body: Widget + +formKey: AuthFormKey + +leftContentMinWidth: double + +leftPanelMinWidth: double + +leftPanelPadding: EdgeInsets - - - +void read() - +void setControlsFrom() - +Study buildFormData() - +void dispose() - +void onCancel() - +dynamic onSave() - -dynamic _applyAndSaveSubform() + + + + + + + + + AuthFormKey - - - - - - - - IStudyRepository + + + +index: int + <static>+values: List<AuthFormKey> + <static>+login: AuthFormKey + <static>+signup: AuthFormKey + <static>+passwordForgot: AuthFormKey + <static>+passwordRecovery: AuthFormKey + <static>-_loginSubmit: AuthFormKey + <static>-_signupSubmit: AuthFormKey - - - - - + + + + + - - - StudyInfoFormViewModel + + + SignupForm - - - +study: Study - +titleControl: FormControl<String> - +iconControl: FormControl<IconOption> - +descriptionControl: FormControl<String> - +organizationControl: FormControl<String> - +reviewBoardControl: FormControl<String> - +reviewBoardNumberControl: FormControl<String> - +researchersControl: FormControl<String> - +emailControl: FormControl<String> - +websiteControl: FormControl<String> - +phoneControl: FormControl<String> - +additionalInfoControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +iconRequired: dynamic - +organizationRequired: dynamic - +reviewBoardRequired: dynamic - +reviewBoardNumberRequired: dynamic - +researchersRequired: dynamic - +emailRequired: dynamic - +phoneRequired: dynamic - +emailFormat: dynamic - +websiteFormat: dynamic + + + +formKey: AuthFormKey - - - +void setControlsFrom() - +StudyInfoFormData buildFormData() + + + +Widget build() + -dynamic _onClickTermsOfUse() + -dynamic _onClickPrivacyPolicy() - - - - - + + + - - - EnrollmentFormViewModel + + + FormConsumerRefWidget - - - +study: Study - +router: GoRouter - +consentItemDelegate: EnrollmentFormConsentItemDelegate - +enrollmentTypeControl: FormControl<Participation> - +consentItemArray: FormArray<dynamic> - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +form: FormGroup - +enrollmentTypeControlOptions: List<FormControlOption<Participation>> - +consentItemModels: List<ConsentItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestScreener: bool - +canTestConsent: bool - +questionTitles: Map<FormMode, String Function()> + + + + + + + + + + PasswordRecoveryForm - - - +void setControlsFrom() - +EnrollmentFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() - +dynamic testScreener() - +dynamic testConsent() - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + + + +formKey: AuthFormKey + + + + + + +Widget build() - - - - - + + + + + - - - MeasurementsFormViewModel + + + PasswordForgotForm - - - +study: Study - +router: GoRouter - +measurementsArray: FormArray<dynamic> - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> - +form: FormGroup - +measurementViewModels: List<MeasurementSurveyFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +measurementRequired: dynamic - +titles: Map<FormMode, String> + + + +formKey: AuthFormKey - - - +void read() - +void setControlsFrom() - +MeasurementsFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +MeasurementSurveyFormViewModel provide() - +void onCancel() - +dynamic onSave() + + + +Widget build() - - - - - + + + + + - - - ReportsFormViewModel + + + AuthFormController - - - +study: Study - +router: GoRouter - +reportItemDelegate: ReportFormItemDelegate - +reportItemArray: FormArray<dynamic> - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +form: FormGroup - +reportItemModels: List<ReportItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestConsent: bool + + + +authRepository: IAuthRepository + +sharedPreferences: SharedPreferences + +notificationService: INotificationService + +router: GoRouter + +emailControl: FormControl<String> + +passwordControl: FormControl<String> + +passwordConfirmationControl: FormControl<String> + +rememberMeControl: FormControl<bool> + +termsOfServiceControl: FormControl<bool> + <static>+authValidationMessages: Map<String, String Function(dynamic)> + +loginForm: FormGroup + +signupForm: FormGroup + +passwordForgotForm: FormGroup + +passwordRecoveryForm: FormGroup + +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> + -_formKey: AuthFormKey + +shouldRemember: bool + +formKey: AuthFormKey + +form: FormGroup + + + + + + -dynamic _onChangeFormKey() + +dynamic resetControlsFor() + -dynamic _forceValidationMessages() + +dynamic signUp() + -dynamic _signUp() + +dynamic signIn() + -dynamic _signInWith() + +dynamic signOut() + +dynamic resetPasswordForEmail() + +dynamic sendPasswordResetLink() + +dynamic recoverPassword() + +dynamic updateUser() + -void _setRememberMe() + -void _delRememberMe() + -void _initRememberMe() - - - +void setControlsFrom() - +ReportsFormData buildFormData() - +void read() - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() - +ReportItemFormRouteArgs buildReportItemFormRouteArgs() - +dynamic testReport() - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() + + + + + + + + SharedPreferences - - - - - + + + - - - InterventionsFormViewModel + + + INotificationService - - - +study: Study - +router: GoRouter - +interventionsArray: FormArray<dynamic> - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> - +form: FormGroup - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +interventionsRequired: dynamic - +titles: Map<FormMode, String> - +canTestStudySchedule: bool + + + + + + + + + EmailTextField - - - +void setControlsFrom() - +InterventionsFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +InterventionFormViewModel provide() - +void onCancel() - +dynamic onSave() - +dynamic testStudySchedule() + + + +labelText: String + +hintText: String? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - - + + + + - - - ConsentItemFormView + + + PasswordTextField - - - +formViewModel: ConsentItemFormViewModel + + + +labelText: String + +hintText: String? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - - - - - - - ConsentItemFormViewModel - - + + + + - - - +consentIdControl: FormControl<String> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +iconControl: FormControl<IconOption> - +form: FormGroup - +consentId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +titles: Map<FormMode, String> + + + StudyUJobsToBeDone - - - +void setControlsFrom() - +ConsentItemFormData buildFormData() - +ConsentItemFormViewModel createDuplicate() + + + +Widget build() - - - - - + + + + + - - - EnrollmentFormData + + + LoginForm - - - <static>+kDefaultEnrollmentType: Participation - +enrollmentType: Participation - +questionnaireFormData: QuestionnaireFormData - +consentItemsFormData: List<ConsentItemFormData>? - +id: String + + + +formKey: AuthFormKey - - - +Study apply() - +EnrollmentFormData copy() + + + +Widget build() - - - + + + + - - - Participation + + + StudyAnalyzeController + + + + + + +dynamic onExport() - - - - - + + + + - - - QuestionnaireFormData + + + StudyAnalyzeScreen - - - +questionsData: List<QuestionFormData>? - +id: String + + + +Widget? banner() + +Widget build() - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() + + + + + + + + + PublishDialog + + + + + + +Widget build() - - - - + + + + - - - IStudyFormData + + + PublishSuccessDialog - - - +Study apply() + + + +Widget build() - - - - + + + + - - - StudyDesignEnrollmentFormView + + + PublishConfirmationDialog - - - +Widget build() - -dynamic _showScreenerQuestionSidesheetWithArgs() - -dynamic _showConsentItemSidesheetWithArgs() + + + +Widget build() - - - - + + + - - - StudyDesignPageWidget + + + App - - - +Widget? banner() + + + + + + + + AppContent - - - - + + + + - - - IScreenerQuestionLogicFormViewModel + + + IStudyAppBarViewModel - - - +isDirtyOptionsBannerVisible: bool + + + +isSyncIndicatorVisible: bool + +isStatusBadgeVisible: bool + +isPublishVisible: bool - - - - - + + + + - - - ScreenerQuestionLogicFormView + + + IStudyStatusBadgeViewModel - - - +formViewModel: ScreenerQuestionFormViewModel + + + +studyParticipation: Participation? + +studyStatus: StudyStatus? - - - +Widget build() - -dynamic _buildInfoBanner() - -dynamic _buildAnswerOptionsLogicControls() - -List<Widget> _buildOptionLogicRow() + + + + + + + + + IStudyNavViewModel + + + + + + +isEditTabEnabled: bool + +isTestTabEnabled: bool + +isRecruitTabEnabled: bool + +isMonitorTabEnabled: bool + +isAnalyzeTabEnabled: bool + +isSettingsEnabled: bool - - - - - - - - - ScreenerQuestionFormViewModel - - + + + + - - - <static>+defaultResponseOptionValidity: bool - +responseOptionsDisabledArray: FormArray<dynamic> - +responseOptionsLogicControls: FormArray<bool> - +responseOptionsLogicDescriptionControls: FormArray<String> - -_questionBaseControls: Map<String, AbstractControl<dynamic>> - +prevResponseOptionControls: List<AbstractControl<dynamic>> - +prevResponseOptionValues: List<dynamic> - +responseOptionsDisabledControls: List<AbstractControl<dynamic>> - +logicControlOptions: List<FormControlOption<bool>> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isDirtyOptionsBannerVisible: bool + + + StudyScaffold - - - +dynamic onResponseOptionsChanged() - +void setControlsFrom() - +QuestionFormData buildFormData() - -List<FormControl<dynamic>> _copyFormControls() - -AbstractControl<dynamic>? _findAssociatedLogicControlFor() - -AbstractControl<dynamic>? _findAssociatedControlFor() - +ScreenerQuestionFormViewModel createDuplicate() + + + +studyId: String + +tabs: List<NavbarTab>? + +tabsSubnav: List<NavbarTab>? + +selectedTab: NavbarTab? + +selectedTabSubnav: NavbarTab? + +body: StudyPageWidget + +drawer: Widget? + +disableActions: bool + +actionsSpacing: double + +actionsPadding: double + +layoutType: SingleColumnLayoutType? + +appbarHeight: double + +appbarSubnavHeight: double - - - - - + + + - - - QuestionFormViewModel + + + NavbarTab - - - <static>+defaultQuestionType: SurveyQuestionType - -_titles: Map<FormMode, String Function()>? - +questionIdControl: FormControl<String> - +questionTypeControl: FormControl<SurveyQuestionType> - +questionTextControl: FormControl<String> - +questionInfoTextControl: FormControl<String> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isMultipleChoiceControl: FormControl<bool> - +choiceResponseOptionsArray: FormArray<dynamic> - +customOptionsMin: int - +customOptionsMax: int - +customOptionsInitial: int - +boolResponseOptionsArray: FormArray<String> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool - - + + + + - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +QuestionFormViewModel createDuplicate() + + + SingleColumnLayoutType - - - - - + + + + - - - EnrollmentFormConsentItemDelegate + + + PreviewFrame - - - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +owner: EnrollmentFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + +studyId: String + +routeArgs: StudyFormRouteArgs? + +route: String? - - - +void onCancel() - +dynamic onSave() - +ConsentItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + + + + + + StudyFormRouteArgs - - - - - + + + + + - - - WithQuestionnaireControls + + + StudyParticipationBadge - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> + + + +participation: Participation + +type: BadgeType + +showPrefixIcon: bool - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() + + + +Widget build() - - - + + + - - - IListActionProvider + + + Participation - - - + + + - - - IProviderArgsResolver + + + BadgeType - - - - - + + + - - - ConsentItemFormData + + + ConsumerWidget - - - +consentId: String - +title: String - +description: String - +iconName: String? - +id: String + + + + + + + + IWithBanner - - - +ConsentItem toConsentItem() - +ConsentItemFormData copy() + + + + + + + + StudyStatus - - - - - + + + + + - - - InterventionsFormData + + + StudyStatusBadge - - - +interventionsData: List<InterventionFormData> - +studyScheduleData: StudyScheduleFormData - +id: String + + + +participation: Participation? + +status: StudyStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool - - - +Study apply() - +InterventionsFormData copy() + + + +Widget build() - - - - - + + + + + - - - StudyScheduleFormData + + + FrameControlsWidget - - - +sequenceType: PhaseSequence - +sequenceTypeCustom: String - +numCycles: int - +phaseDuration: int - +includeBaseline: bool - +id: String + + + +onRefresh: void Function()? + +onOpenNewTab: void Function()? + +enabled: bool - - - +StudySchedule toStudySchedule() - +Study apply() - +StudyScheduleFormData copy() + + + +Widget build() - - - - - + + + + + - - - InterventionTaskFormViewModel + + + StudyTestScreen - - - +taskIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +taskTitleControl: FormControl<String> - +taskDescriptionControl: FormControl<String> - +markAsCompletedControl: FormControl<bool> - +form: FormGroup - +taskId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +titles: Map<FormMode, String> + + + +previewRoute: String? - - - +void setControlsFrom() - +InterventionTaskFormData buildFormData() - +InterventionTaskFormViewModel createDuplicate() + + + +Widget build() + +Widget? banner() + +dynamic load() + +dynamic save() + +dynamic showHelp() - - - - - + + + + - - - WithScheduleControls + + + StudyNav - - - +isTimeRestrictedControl: FormControl<bool> - +instanceID: FormControl<String> - +restrictedTimeStartControl: FormControl<Time> - +restrictedTimeStartPickerControl: FormControl<TimeOfDay> - +restrictedTimeEndControl: FormControl<Time> - +restrictedTimeEndPickerControl: FormControl<TimeOfDay> - +hasReminderControl: FormControl<bool> - +reminderTimeControl: FormControl<Time> - +reminderTimePickerControl: FormControl<TimeOfDay> - -_reminderControlStream: StreamSubscription<dynamic>? - +scheduleFormControls: Map<String, FormControl<Object>> - +hasReminder: bool - +isTimeRestricted: bool - +timeRestriction: List<Time>? + + + <static>+dynamic tabs() + <static>+dynamic edit() + <static>+dynamic test() + <static>+dynamic recruit() + <static>+dynamic monitor() + <static>+dynamic analyze() - - - +void setScheduleControlsFrom() - -dynamic _initReminderControl() + + + + + + + + + StudyDesignNav + + + + + + <static>+dynamic tabs() + <static>+dynamic info() + <static>+dynamic enrollment() + <static>+dynamic interventions() + <static>+dynamic measurements() + <static>+dynamic reports() - - - - + + + + + - - - InterventionTaskFormView + + + RouteInformation - - - +formViewModel: InterventionTaskFormViewModel + + + +route: String? + +extra: String? + +cmd: String? + +data: String? - - - - - - - - PhaseSequence + + + +String toString() - - - - + + + + + - - - InterventionFormView + + + PlatformController - - - +formViewModel: InterventionFormViewModel + + + +studyId: String + +baseSrc: String + +previewSrc: String + +routeInformation: RouteInformation + +frameWidget: Widget + + + + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void listen() + +void send() + +void openNewPage() - - - - - + + + + + - - - InterventionFormViewModel + + + WebController - - - +study: Study - +interventionIdControl: FormControl<String> - +interventionTitleControl: FormControl<String> - +interventionIconControl: FormControl<IconOption> - +interventionDescriptionControl: FormControl<String> - +interventionTasksArray: FormArray<dynamic> - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> - +form: FormGroup - +interventionId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneTask: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> + + + +iFrameElement: IFrameElement - - - +void setControlsFrom() - +InterventionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +void onCancel() - +dynamic onSave() - +InterventionTaskFormViewModel provide() - +InterventionTaskFormRouteArgs buildNewFormRouteArgs() - +InterventionTaskFormRouteArgs buildFormRouteArgs() - +InterventionFormViewModel createDuplicate() + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void openNewPage() + +void listen() + +void send() - - - - - + + + - - - StudyScheduleControls + + + IFrameElement - - - <static>+defaultScheduleType: PhaseSequence - <static>+defaultScheduleTypeSequence: String - <static>+defaultNumCycles: int - <static>+defaultPeriodLength: int - +sequenceTypeControl: FormControl<PhaseSequence> - +sequenceTypeCustomControl: FormControl<String> - +phaseDurationControl: FormControl<int> - +numCyclesControl: FormControl<int> - +includeBaselineControl: FormControl<bool> - +studyScheduleControls: Map<String, FormControl<Object>> - <static>+kNumCyclesMin: int - <static>+kNumCyclesMax: int - <static>+kPhaseDurationMin: int - <static>+kPhaseDurationMax: int - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +numCyclesRange: dynamic - +phaseDurationRange: dynamic - +customSequenceRequired: dynamic + + + + + + + + + MobileController - - - +void setStudyScheduleControlsFrom() - +StudyScheduleFormData buildStudyScheduleFormData() - +bool isSequencingCustom() + + + +void openNewPage() + +void refresh() + +void registerViews() + +void listen() + +void send() + +void navigate() + +void activate() + +void generateUrl() - - - - - + + + + + - - - InterventionFormData + + + StudySettingsFormViewModel - - - +interventionId: String - +title: String - +description: String? - +tasksData: List<InterventionTaskFormData>? - +iconName: String? - <static>+kDefaultTitle: String - +id: String + + + +study: AsyncValue<Study> + +studyRepository: IStudyRepository + <static>+defaultPublishedToRegistry: bool + <static>+defaultPublishedToRegistryResults: bool + +isPublishedToRegistryControl: FormControl<bool> + +isPublishedToRegistryResultsControl: FormControl<bool> + +form: FormGroup + +titles: Map<FormMode, String> - - - +Intervention toIntervention() - +InterventionFormData copy() + + + +void setControlsFrom() + +Study buildFormData() + +dynamic keepControlsSynced() + +dynamic save() + +dynamic setLaunchDefaults() - - - - - + + + - - - StudyScheduleFormView + + + AsyncValue - - - +formViewModel: StudyScheduleControls + + + + + + + + + StudySettingsDialog - - - -FormTableRow _renderCustomSequence() - +Widget build() + + + +Widget build() - - - - + + + + + - - - StudyDesignInterventionsFormView + + + WebFrame - - - +Widget build() + + + +previewSrc: String + +studyId: String - - - - - - - - - - InterventionTaskFormData + + + +Widget build() - - - +taskId: String - +taskTitle: String - +taskDescription: String? - <static>+kDefaultTitle: String - +id: String + + + + + + + + + DisabledFrame - - - +CheckmarkTask toTask() - +InterventionTaskFormData copy() + + + +Widget build() - - - - - + + + + + - - - IFormDataWithSchedule + + + PhoneContainer - - - +instanceId: String - +isTimeLocked: bool - +timeLockStart: StudyUTimeOfDay? - +timeLockEnd: StudyUTimeOfDay? - +hasReminder: bool - +reminderTime: StudyUTimeOfDay? + + + <static>+defaultWidth: double + <static>+defaultHeight: double + +width: double + +height: double + +borderColor: Color + +borderWidth: double + +borderRadius: double + +innerContent: Widget + +innerContentBackgroundColor: Color? - - - +Schedule toSchedule() + + + +Widget build() - - - - - + + + - - - InterventionPreview + + + Color - - - +routeArgs: InterventionFormRouteArgs + + + + + + + + + MobileFrame - - - +Widget build() + + + +Widget build() - - - + + + + - - - InterventionFormRouteArgs + + + DesktopFrame - - - - - - - - ConsumerWidget + + + +Widget build() - - - - + + + + - - - StudyFormValidationSet + + + StudyTestController - - - +index: int - <static>+values: List<StudyFormValidationSet> + + + +authRepository: IAuthRepository + +languageCode: String - - - - - + + + + + - - - StudyInfoFormData + + + StudyController - - - +title: String - +description: String? - +iconName: String - +contactInfoFormData: StudyContactInfoFormData - +id: String + + + +notificationService: INotificationService + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? + +studyActions: List<ModelAction<dynamic>> - - - +Study apply() - +StudyInfoFormData copy() + + + +dynamic syncStudyStatus() + +dynamic onStudySubscriptionUpdate() + -dynamic _redirectNewToActualStudyID() + +dynamic publishStudy() + +void onChangeStudyParticipation() + +void onAddParticipants() + +void onSettingsPressed() + +void dispose() - - - - - - - - - StudyContactInfoFormData - - + + + + - - - +organization: String? - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String? - +website: String? - +phone: String? - +additionalInfo: String? - +id: String + + + TestAppRoutes - - - +Study apply() - +StudyInfoFormData copy() + + + <static>+studyOverview: String + <static>+eligibility: String + <static>+intervention: String + <static>+consent: String + <static>+journey: String + <static>+dashboard: String - - + + - + StudyDesignInfoFormView - + +Widget build() - - - - - - - - StudyDesignMeasurementsFormView - - - - - - +Widget build() - - - - - - - - - - - - - SurveyPreview - - + + + + - - - +routeArgs: MeasurementFormRouteArgs + + + StudyDesignPageWidget - - - +Widget build() + + + +Widget? banner() - - - + + + + + - - - MeasurementFormRouteArgs + + + StudyInfoFormViewModel - - - - - - - - - MeasurementSurveyFormView + + + +study: Study + +titleControl: FormControl<String> + +iconControl: FormControl<IconOption> + +descriptionControl: FormControl<String> + +organizationControl: FormControl<String> + +reviewBoardControl: FormControl<String> + +reviewBoardNumberControl: FormControl<String> + +researchersControl: FormControl<String> + +emailControl: FormControl<String> + +websiteControl: FormControl<String> + +phoneControl: FormControl<String> + +additionalInfoControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +iconRequired: dynamic + +organizationRequired: dynamic + +reviewBoardRequired: dynamic + +reviewBoardNumberRequired: dynamic + +researchersRequired: dynamic + +emailRequired: dynamic + +phoneRequired: dynamic + +emailFormat: dynamic + +websiteFormat: dynamic - - - +formViewModel: MeasurementSurveyFormViewModel + + + +void setControlsFrom() + +StudyInfoFormData buildFormData() - - - - - + + + + + - - - MeasurementSurveyFormViewModel + + + StudyInfoFormData - - - +study: Study - +measurementIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +surveyTitleControl: FormControl<String> - +surveyIntroTextControl: FormControl<String> - +surveyOutroTextControl: FormControl<String> - +form: FormGroup - +measurementId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneQuestion: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> + + + +title: String + +description: String? + +iconName: String + +contactInfoFormData: StudyContactInfoFormData + +id: String - - - +void setControlsFrom() - +MeasurementSurveyFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() - +SurveyQuestionFormRouteArgs buildFormRouteArgs() - +MeasurementSurveyFormViewModel createDuplicate() + + + +Study apply() + +StudyInfoFormData copy() - - - - - + + + + + - - - MeasurementSurveyFormData + + + StudyContactInfoFormData - - - +measurementId: String - +title: String - +introText: String? - +outroText: String? - +questionnaireFormData: QuestionnaireFormData - <static>+kDefaultTitle: String - +id: String + + + +organization: String? + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String? + +website: String? + +phone: String? + +additionalInfo: String? + +id: String - - - +QuestionnaireTask toQuestionnaireTask() - +MeasurementSurveyFormData copy() + + + +Study apply() + +StudyInfoFormData copy() - - - - - - - - - MeasurementsFormData - - + + + + - - - +surveyMeasurements: List<MeasurementSurveyFormData> - +id: String + + + IStudyFormData - - - +Study apply() - +MeasurementsFormData copy() + + + +Study apply() - - - + + + - + StudyFormScaffold - + +studyId: String +formViewModelBuilder: T Function(WidgetRef) @@ -6329,7 +6070,7 @@ - + +Widget build() @@ -6338,9 +6079,9 @@ - + - + T Function(WidgetRef) @@ -6349,354 +6090,465 @@ - + - + Widget Function(T) - - - + + + + - - - StudyUTimeOfDay + + + StudyFormValidationSet + + + + + + +index: int + <static>+values: List<StudyFormValidationSet> - - - - - + + + + - - - ScheduleControls + + + StudyDesignMeasurementsFormView - - - +formViewModel: WithScheduleControls + + + +Widget build() - - - +Widget build() - -List<FormTableRow> _conditionalTimeRestrictions() + + + + + + + + + + MeasurementsFormViewModel + + + + + + +study: Study + +router: GoRouter + +measurementsArray: FormArray<dynamic> + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> + +form: FormGroup + +measurementViewModels: List<MeasurementSurveyFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +measurementRequired: dynamic + +titles: Map<FormMode, String> + + + + + + +void read() + +void setControlsFrom() + +MeasurementsFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +MeasurementSurveyFormViewModel provide() + +void onCancel() + +dynamic onSave() - - - - + + + - - - SurveyQuestionType + + + IListActionProvider - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType + + + + + + + + IProviderArgsResolver - - - - - + + + + + - - - QuestionFormData + + + MeasurementsFormData - - - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> - +questionId: String - +questionText: String - +questionInfoText: String? - +questionType: SurveyQuestionType - +responseOptionsValidity: Map<dynamic, bool> - +responseOptions: List<dynamic> - +id: String + + + +surveyMeasurements: List<MeasurementSurveyFormData> + +id: String - - - +Question<dynamic> toQuestion() - +EligibilityCriterion toEligibilityCriterion() - +Answer<dynamic> constructAnswerFor() - +dynamic setResponseOptionsValidityFrom() - +QuestionFormData copy() + + + +Study apply() + +MeasurementsFormData copy() - - - - - + + + + + - - - ChoiceQuestionFormData + + + MeasurementSurveyFormViewModel - - - +isMultipleChoice: bool - +answerOptions: List<String> - +responseOptions: List<String> + + + +study: Study + +measurementIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +surveyTitleControl: FormControl<String> + +surveyIntroTextControl: FormControl<String> + +surveyOutroTextControl: FormControl<String> + +form: FormGroup + +measurementId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneQuestion: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - +Question<dynamic> toQuestion() - +QuestionFormData copy() - -Choice _buildChoiceForValue() - +Answer<dynamic> constructAnswerFor() + + + +void setControlsFrom() + +MeasurementSurveyFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() + +SurveyQuestionFormRouteArgs buildFormRouteArgs() + +MeasurementSurveyFormViewModel createDuplicate() - - - - - + + + + + - - - BoolQuestionFormData + + + WithQuestionnaireControls - - - <static>+kResponseOptions: Map<String, bool> - +responseOptions: List<String> + + + +questionsArray: FormArray<dynamic> + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> + +questionnaireControls: Map<String, FormArray<dynamic>> + +propagateOnSave: bool + +questionModels: List<Q> + +questionTitles: Map<FormMode, String Function()> - - - +Question<dynamic> toQuestion() - +BoolQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +void setQuestionnaireControlsFrom() + +QuestionnaireFormData buildQuestionnaireFormData() + +void read() + +void onCancel() + +dynamic onSave() + +Q provide() + +Q provideQuestionFormViewModel() - - - - - + + + + + - - - ScaleQuestionFormData + + + WithScheduleControls - - - +minValue: double - +maxValue: double - +minLabel: String? - +maxLabel: String? - +midValues: List<double?> - +midLabels: List<String?> - +stepSize: double - +initialValue: double? - +minColor: Color? - +maxColor: Color? - +responseOptions: List<double> - +midAnnotations: List<Annotation> + + + +isTimeRestrictedControl: FormControl<bool> + +instanceID: FormControl<String> + +restrictedTimeStartControl: FormControl<Time> + +restrictedTimeStartPickerControl: FormControl<TimeOfDay> + +restrictedTimeEndControl: FormControl<Time> + +restrictedTimeEndPickerControl: FormControl<TimeOfDay> + +hasReminderControl: FormControl<bool> + +reminderTimeControl: FormControl<Time> + +reminderTimePickerControl: FormControl<TimeOfDay> + -_reminderControlStream: StreamSubscription<dynamic>? + +scheduleFormControls: Map<String, FormControl<Object>> + +hasReminder: bool + +isTimeRestricted: bool + +timeRestriction: List<Time>? - - - +ScaleQuestion toQuestion() - +QuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +void setScheduleControlsFrom() + -dynamic _initReminderControl() - - - + + + + + - - - Color + + + MeasurementSurveyFormData - - - - - - - - - IScaleQuestionFormViewModel + + + +measurementId: String + +title: String + +introText: String? + +outroText: String? + +questionnaireFormData: QuestionnaireFormData + <static>+kDefaultTitle: String + +id: String - - - +isMidValuesClearedInfoVisible: bool + + + +QuestionnaireTask toQuestionnaireTask() + +MeasurementSurveyFormData copy() - - - - + + + + + - - - ScaleQuestionFormView + + + QuestionnaireFormData - - - +formViewModel: QuestionFormViewModel + + + +questionsData: List<QuestionFormData>? + +id: String + + + + + + +StudyUQuestionnaire toQuestionnaire() + +List<EligibilityCriterion> toEligibilityCriteria() + +QuestionnaireFormData copy() - - - - - + + + + + - - - BoolQuestionFormView + + + IFormDataWithSchedule - - - +formViewModel: QuestionFormViewModel + + + +instanceId: String + +isTimeLocked: bool + +timeLockStart: StudyUTimeOfDay? + +timeLockEnd: StudyUTimeOfDay? + +hasReminder: bool + +reminderTime: StudyUTimeOfDay? - - - +Widget build() + + + +Schedule toSchedule() - - - - - + + + + + - - - ChoiceQuestionFormView + + + SurveyPreview - - - +formViewModel: QuestionFormViewModel + + + +routeArgs: MeasurementFormRouteArgs - - - +Widget build() + + + +Widget build() - - - - + + + - - - SurveyQuestionFormView + + + MeasurementFormRouteArgs - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool + + + + + + + + + MeasurementSurveyFormView + + + + + + +formViewModel: MeasurementSurveyFormViewModel - - - - + + + + + - - - StudyDesignReportsFormView + + + ReportsFormViewModel - - - +Widget build() - -dynamic _showReportItemSidesheetWithArgs() + + + +study: Study + +router: GoRouter + +reportItemDelegate: ReportFormItemDelegate + +reportItemArray: FormArray<dynamic> + +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +form: FormGroup + +reportItemModels: List<ReportItemFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + +canTestConsent: bool + + + + + + +void setControlsFrom() + +ReportsFormData buildFormData() + +void read() + +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() + +ReportItemFormRouteArgs buildReportItemFormRouteArgs() + +dynamic testReport() + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() - - - + + + - + ReportFormItemDelegate - + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> +owner: ReportsFormViewModel @@ -6705,7 +6557,7 @@ - + +void onCancel() +dynamic onSave() @@ -6719,17 +6571,17 @@ - - - + + + - + ReportItemFormView - + +formViewModel: ReportItemFormViewModel +studyId: String @@ -6738,7 +6590,7 @@ - + +Widget build() -dynamic _buildSectionText() @@ -6749,17 +6601,17 @@ - - - + + + - + ReportItemFormViewModel - + <static>+defaultSectionType: ReportSectionType +sectionIdControl: FormControl<String> @@ -6792,7 +6644,7 @@ - + -List<FormControlValidation> _getValidationConfig() +ReportItemFormData buildFormData() @@ -6806,28 +6658,130 @@ - + - + Widget Function(BuildContext) + + + + + + + + + LinearRegressionSectionFormView + + + + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + + + + +Widget build() + + + + + + + + + + + + + DataReferenceIdentifier + + + + + + +hashCode: int + + + + + + +bool ==() + + + + + + + + + + + DataReference + + + + + + + + + + + + + DataReferenceEditor + + + + + + +formControl: FormControl<DataReferenceIdentifier<T>> + +availableTasks: List<Task> + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + + + + + + +FormTableRow buildFormTableRow() + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + + + + + + + + + + + ReactiveDropdownField + + + + - - - + + + - + TemporalAggregationFormatted - + -_value: TemporalAggregation <static>+values: List<TemporalAggregationFormatted> @@ -6838,7 +6792,7 @@ - + +bool ==() +String toString() @@ -6850,9 +6804,9 @@ - + - + TemporalAggregation @@ -6861,17 +6815,17 @@ - - - + + + - + ImprovementDirectionFormatted - + -_value: ImprovementDirection <static>+values: List<ImprovementDirectionFormatted> @@ -6882,7 +6836,7 @@ - + +bool ==() +String toString() @@ -6894,9 +6848,9 @@ - + - + ImprovementDirection @@ -6905,16 +6859,16 @@ - - + + - + ReportSectionType - + +index: int <static>+values: List<ReportSectionType> @@ -6924,94 +6878,19 @@ - - - - - - - - - DataReferenceIdentifier - - - - - - +hashCode: int - - - - - - +bool ==() - - - - - - - - - - - DataReference - - - - - - - - - - - - - DataReferenceEditor - - - - - - +formControl: FormControl<DataReferenceIdentifier<T>> - +availableTasks: List<Task> - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - - - - +FormTableRow buildFormTableRow() - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - - - - - - - - - ReactiveDropdownField - - - - - - - + + + - + AverageSectionFormView - + +formViewModel: ReportItemFormViewModel +studyId: String @@ -7019,53 +6898,26 @@ - + +Widget build() - - - - - - - - - LinearRegressionSectionFormView - - - - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - - - - +Widget build() - - - - - - - + + + - + ReportItemFormData - + +isPrimary: bool +section: ReportSection @@ -7073,7 +6925,7 @@ - + <static>+dynamic fromDomainModel() +ReportItemFormData copy() @@ -7083,9 +6935,9 @@ - + - + ReportSection @@ -7094,24 +6946,24 @@ - - - + + + - + ReportsFormData - + +reportItems: List<ReportItemFormData> +id: String - + +Study apply() +ReportsFormData copy() @@ -7121,16 +6973,16 @@ - - + + - + ReportStatus - + +index: int <static>+values: List<ReportStatus> @@ -7140,19 +6992,38 @@ + + + + + + + + StudyDesignReportsFormView + + + + + + +Widget build() + -dynamic _showReportItemSidesheetWithArgs() + + + + - - - + + + - + ReportBadge - + +status: ReportStatus? +type: BadgeType @@ -7161,1047 +7032,1253 @@ - + +Widget build() - - - + + + + - - - BadgeType + + + StudyDesignEnrollmentFormView + + + + + + +Widget build() + -dynamic _showScreenerQuestionSidesheetWithArgs() + -dynamic _showConsentItemSidesheetWithArgs() - - - - + + + + + - - - AppStatus + + + ConsentItemFormData - - - +index: int - <static>+values: List<AppStatus> - <static>+initializing: AppStatus - <static>+initialized: AppStatus + + + +consentId: String + +title: String + +description: String + +iconName: String? + +id: String + + + + + + +ConsentItem toConsentItem() + +ConsentItemFormData copy() - - - - + + + + + - - - PublishDialog + + + EnrollmentFormData - - - +Widget build() + + + <static>+kDefaultEnrollmentType: Participation + +enrollmentType: Participation + +questionnaireFormData: QuestionnaireFormData + +consentItemsFormData: List<ConsentItemFormData>? + +id: String + + + + + + +Study apply() + +EnrollmentFormData copy() - - - - + + + + + - - - PublishConfirmationDialog + + + ConsentItemFormViewModel + + + + + + +consentIdControl: FormControl<String> + +titleControl: FormControl<String> + +descriptionControl: FormControl<String> + +iconControl: FormControl<IconOption> + +form: FormGroup + +consentId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +titles: Map<FormMode, String> - - - +Widget build() + + + +void setControlsFrom() + +ConsentItemFormData buildFormData() + +ConsentItemFormViewModel createDuplicate() - - - - + + + + - - - PublishSuccessDialog + + + IScreenerQuestionLogicFormViewModel - - - +Widget build() + + + +isDirtyOptionsBannerVisible: bool - - - - - - - - StudyAnalyzeScreen - - + + + + + - - - +Widget? banner() - +Widget build() + + + ScreenerQuestionLogicFormView - - - - - - - - - StudyAnalyzeController + + + +formViewModel: ScreenerQuestionFormViewModel - - - +dynamic onExport() + + + +Widget build() + -dynamic _buildInfoBanner() + -dynamic _buildAnswerOptionsLogicControls() + -List<Widget> _buildOptionLogicRow() - - - - - + + + + + - - - StudyParticipationBadge + + + ScreenerQuestionFormViewModel - - - +participation: Participation - +type: BadgeType - +showPrefixIcon: bool + + + <static>+defaultResponseOptionValidity: bool + +responseOptionsDisabledArray: FormArray<dynamic> + +responseOptionsLogicControls: FormArray<bool> + +responseOptionsLogicDescriptionControls: FormArray<String> + -_questionBaseControls: Map<String, AbstractControl<dynamic>> + +prevResponseOptionControls: List<AbstractControl<dynamic>> + +prevResponseOptionValues: List<dynamic> + +responseOptionsDisabledControls: List<AbstractControl<dynamic>> + +logicControlOptions: List<FormControlOption<bool>> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isDirtyOptionsBannerVisible: bool - - - +Widget build() + + + +dynamic onResponseOptionsChanged() + +void setControlsFrom() + +QuestionFormData buildFormData() + -List<FormControl<dynamic>> _copyFormControls() + -AbstractControl<dynamic>? _findAssociatedLogicControlFor() + -AbstractControl<dynamic>? _findAssociatedControlFor() + +ScreenerQuestionFormViewModel createDuplicate() - - - - - + + + + + - - - RouteInformation + + + QuestionFormViewModel - - - +route: String? - +extra: String? - +cmd: String? - +data: String? + + + <static>+defaultQuestionType: SurveyQuestionType + -_titles: Map<FormMode, String Function()>? + +questionIdControl: FormControl<String> + +questionTypeControl: FormControl<SurveyQuestionType> + +questionTextControl: FormControl<String> + +questionInfoTextControl: FormControl<String> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isMultipleChoiceControl: FormControl<bool> + +choiceResponseOptionsArray: FormArray<dynamic> + +customOptionsMin: int + +customOptionsMax: int + +customOptionsInitial: int + +boolResponseOptionsArray: FormArray<String> + <static>+kDefaultScaleMinValue: int + <static>+kDefaultScaleMaxValue: int + <static>+kNumMidValueControls: int + <static>+kMidValueDebounceMilliseconds: int + +scaleMinValueControl: FormControl<int> + +scaleMaxValueControl: FormControl<int> + -_scaleRangeControl: FormControl<int> + +scaleMinLabelControl: FormControl<String> + +scaleMaxLabelControl: FormControl<String> + +scaleMidValueControls: FormArray<int> + +scaleMidLabelControls: FormArray<String?> + -_scaleResponseOptionsArray: FormArray<int> + +scaleMinColorControl: FormControl<SerializableColor> + +scaleMaxColorControl: FormControl<SerializableColor> + +prevMidValues: List<int?>? + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +form: FormGroup + +questionId: String + +questionType: SurveyQuestionType + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> + +answerOptionsArray: FormArray<dynamic> + +answerOptionsControls: List<AbstractControl<dynamic>> + +validAnswerOptions: List<String> + +boolOptions: List<AbstractControl<String>> + +scaleMinValue: int + +scaleMaxValue: int + +scaleRange: int + +scaleAllValueControls: List<AbstractControl<int>> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +questionTextRequired: dynamic + +numValidChoiceOptions: dynamic + +scaleRangeValid: dynamic + +titles: Map<FormMode, String> + +isAddOptionButtonVisible: bool + +isMidValuesClearedInfoVisible: bool - - - +String toString() + + + +String? scaleMidLabelAt() + -dynamic _onScaleRangeChanged() + -dynamic _applyInputFormatters() + -dynamic _updateScaleMidValueControls() + -List<FormControlValidation> _getValidationConfig() + +dynamic onQuestionTypeChanged() + +dynamic onResponseOptionsChanged() + -void _updateFormControls() + +void initControls() + +void setControlsFrom() + +QuestionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() + +QuestionFormViewModel createDuplicate() - - - - - + + + + + - - - PlatformController + + + EnrollmentFormViewModel - - - +studyId: String - +baseSrc: String - +previewSrc: String - +routeInformation: RouteInformation - +frameWidget: Widget + + + +study: Study + +router: GoRouter + +consentItemDelegate: EnrollmentFormConsentItemDelegate + +enrollmentTypeControl: FormControl<Participation> + +consentItemArray: FormArray<dynamic> + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +form: FormGroup + +enrollmentTypeControlOptions: List<FormControlOption<Participation>> + +consentItemModels: List<ConsentItemFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + +canTestScreener: bool + +canTestConsent: bool + +questionTitles: Map<FormMode, String Function()> - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void listen() - +void send() - +void openNewPage() + + + +void setControlsFrom() + +EnrollmentFormData buildFormData() + +void read() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() + +dynamic testScreener() + +dynamic testConsent() + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() - - - - - - - - - WebController - - + + + + + - - - +iFrameElement: IFrameElement + + + EnrollmentFormConsentItemDelegate - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void openNewPage() - +void listen() - +void send() + + + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +owner: EnrollmentFormViewModel + +propagateOnSave: bool + +validationSet: dynamic - - - - - - - - IFrameElement + + + +void onCancel() + +dynamic onSave() + +ConsentItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - - + + + + - - - MobileController + + + ConsentItemFormView - - - +void openNewPage() - +void refresh() - +void registerViews() - +void listen() - +void send() - +void navigate() - +void activate() - +void generateUrl() + + + +formViewModel: ConsentItemFormViewModel - - - - + + + - - - IStudyAppBarViewModel + + + StudyUTimeOfDay - - - +isSyncIndicatorVisible: bool - +isStatusBadgeVisible: bool - +isPublishVisible: bool + + + + + + + + + + ScheduleControls - - - - - - - - - IStudyStatusBadgeViewModel + + + +formViewModel: WithScheduleControls - - - +studyParticipation: Participation? - +studyStatus: StudyStatus? + + + +Widget build() + -List<FormTableRow> _conditionalTimeRestrictions() - - - - + + + + - - - IStudyNavViewModel + + + SurveyQuestionType - - - +isEditTabEnabled: bool - +isTestTabEnabled: bool - +isRecruitTabEnabled: bool - +isMonitorTabEnabled: bool - +isAnalyzeTabEnabled: bool - +isSettingsEnabled: bool + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType - - - - + + + + + - - - StudyScaffold + + + ChoiceQuestionFormView - - - +studyId: String - +tabs: List<NavbarTab>? - +tabsSubnav: List<NavbarTab>? - +selectedTab: NavbarTab? - +selectedTabSubnav: NavbarTab? - +body: StudyPageWidget - +drawer: Widget? - +disableActions: bool - +actionsSpacing: double - +actionsPadding: double - +layoutType: SingleColumnLayoutType? - +appbarHeight: double - +appbarSubnavHeight: double + + + +formViewModel: QuestionFormViewModel - - - - - - - - NavbarTab + + + +Widget build() - - - + + + + + - - - SingleColumnLayoutType + + + BoolQuestionFormView - - - - - - + + + +formViewModel: QuestionFormViewModel + + - - - StudyController + + + +Widget build() - - - +notificationService: INotificationService - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? - +studyActions: List<ModelAction<dynamic>> + + + + + + + + + IScaleQuestionFormViewModel - - - +dynamic syncStudyStatus() - +dynamic onStudySubscriptionUpdate() - -dynamic _redirectNewToActualStudyID() - +dynamic publishStudy() - +void onChangeStudyParticipation() - +void onAddParticipants() - +void onSettingsPressed() - +void dispose() + + + +isMidValuesClearedInfoVisible: bool - - - + + + + - - - StudyStatus + + + ScaleQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel - - - - - + + + + + - - - StudyStatusBadge + + + QuestionFormData - - - +participation: Participation? - +status: StudyStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> + +questionId: String + +questionText: String + +questionInfoText: String? + +questionType: SurveyQuestionType + +responseOptionsValidity: Map<dynamic, bool> + +responseOptions: List<dynamic> + +id: String - - - +Widget build() + + + +Question<dynamic> toQuestion() + +EligibilityCriterion toEligibilityCriterion() + +Answer<dynamic> constructAnswerFor() + +dynamic setResponseOptionsValidityFrom() + +QuestionFormData copy() - - - - + + + + + - - - StudyTestController + + + ChoiceQuestionFormData - - - +authRepository: IAuthRepository - +languageCode: String + + + +isMultipleChoice: bool + +answerOptions: List<String> + +responseOptions: List<String> + + + + + + +Question<dynamic> toQuestion() + +QuestionFormData copy() + -Choice _buildChoiceForValue() + +Answer<dynamic> constructAnswerFor() - - - - + + + + + - - - TestAppRoutes + + + BoolQuestionFormData - - - <static>+studyOverview: String - <static>+eligibility: String - <static>+intervention: String - <static>+consent: String - <static>+journey: String - <static>+dashboard: String + + + <static>+kResponseOptions: Map<String, bool> + +responseOptions: List<String> + + + + + + +Question<dynamic> toQuestion() + +BoolQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - + + + + + - - - StudyNav + + + ScaleQuestionFormData + + + + + + +minValue: double + +maxValue: double + +minLabel: String? + +maxLabel: String? + +midValues: List<double?> + +midLabels: List<String?> + +stepSize: double + +initialValue: double? + +minColor: Color? + +maxColor: Color? + +responseOptions: List<double> + +midAnnotations: List<Annotation> - - - <static>+dynamic tabs() - <static>+dynamic edit() - <static>+dynamic test() - <static>+dynamic recruit() - <static>+dynamic monitor() - <static>+dynamic analyze() + + + +ScaleQuestion toQuestion() + +QuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - + + + + - - - StudyDesignNav + + + SurveyQuestionFormView - - - <static>+dynamic tabs() - <static>+dynamic info() - <static>+dynamic enrollment() - <static>+dynamic interventions() - <static>+dynamic measurements() - <static>+dynamic reports() + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool - - - - + + + + + - - - StudySettingsDialog + + + StudyFormViewModel - - - +Widget build() + + + +studyDirtyCopy: Study? + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +router: GoRouter + +studyInfoFormViewModel: StudyInfoFormViewModel + +enrollmentFormViewModel: EnrollmentFormViewModel + +measurementsFormViewModel: MeasurementsFormViewModel + +reportsFormViewModel: ReportsFormViewModel + +interventionsFormViewModel: InterventionsFormViewModel + +form: FormGroup + +isStudyReadonly: bool + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + + + + + + +void read() + +void setControlsFrom() + +Study buildFormData() + +void dispose() + +void onCancel() + +dynamic onSave() + -dynamic _applyAndSaveSubform() - - - - - + + + + + - - - StudySettingsFormViewModel + + + InterventionsFormViewModel - - - +study: AsyncValue<Study> - +studyRepository: IStudyRepository - <static>+defaultPublishedToRegistry: bool - <static>+defaultPublishedToRegistryResults: bool - +isPublishedToRegistryControl: FormControl<bool> - +isPublishedToRegistryResultsControl: FormControl<bool> - +form: FormGroup - +titles: Map<FormMode, String> + + + +study: Study + +router: GoRouter + +interventionsArray: FormArray<dynamic> + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> + +form: FormGroup + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +interventionsRequired: dynamic + +titles: Map<FormMode, String> + +canTestStudySchedule: bool - - - +void setControlsFrom() - +Study buildFormData() - +dynamic keepControlsSynced() - +dynamic save() - +dynamic setLaunchDefaults() + + + +void setControlsFrom() + +InterventionsFormData buildFormData() + +void read() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +InterventionFormViewModel provide() + +void onCancel() + +dynamic onSave() + +dynamic testStudySchedule() - - - + + + + + - - - AsyncValue + + + StudyScheduleControls - - - - + + + <static>+defaultScheduleType: PhaseSequence + <static>+defaultScheduleTypeSequence: String + <static>+defaultNumCycles: int + <static>+defaultPeriodLength: int + +sequenceTypeControl: FormControl<PhaseSequence> + +sequenceTypeCustomControl: FormControl<String> + +phaseDurationControl: FormControl<int> + +numCyclesControl: FormControl<int> + +includeBaselineControl: FormControl<bool> + +studyScheduleControls: Map<String, FormControl<Object>> + <static>+kNumCyclesMin: int + <static>+kNumCyclesMax: int + <static>+kPhaseDurationMin: int + <static>+kPhaseDurationMax: int + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +numCyclesRange: dynamic + +phaseDurationRange: dynamic + +customSequenceRequired: dynamic + + - - - IWithBanner + + + +void setStudyScheduleControlsFrom() + +StudyScheduleFormData buildStudyScheduleFormData() + +bool isSequencingCustom() - - - - - + + + - - - StudyTestScreen + + + PhaseSequence - - - +previewRoute: String? + + + + + + + + + StudyDesignInterventionsFormView - - - +Widget build() - +Widget? banner() - +dynamic load() - +dynamic save() - +dynamic showHelp() + + + +Widget build() - - - - - + + + + + - - - FrameControlsWidget + + + InterventionFormViewModel - - - +onRefresh: void Function()? - +onOpenNewTab: void Function()? - +enabled: bool + + + +study: Study + +interventionIdControl: FormControl<String> + +interventionTitleControl: FormControl<String> + +interventionIconControl: FormControl<IconOption> + +interventionDescriptionControl: FormControl<String> + +interventionTasksArray: FormArray<dynamic> + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> + +form: FormGroup + +interventionId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneTask: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - +Widget build() + + + +void setControlsFrom() + +InterventionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +void onCancel() + +dynamic onSave() + +InterventionTaskFormViewModel provide() + +InterventionTaskFormRouteArgs buildNewFormRouteArgs() + +InterventionTaskFormRouteArgs buildFormRouteArgs() + +InterventionFormViewModel createDuplicate() - - - - + + + + + - - - PreviewFrame + + + StudyScheduleFormView - - - +studyId: String - +routeArgs: StudyFormRouteArgs? - +route: String? + + + +formViewModel: StudyScheduleControls - - - - - - - - StudyFormRouteArgs + + + -FormTableRow _renderCustomSequence() + +Widget build() - - - - - - - - - WebFrame + + + + + + + + + StudyScheduleFormData - - - +previewSrc: String - +studyId: String + + + +sequenceType: PhaseSequence + +sequenceTypeCustom: String + +numCycles: int + +phaseDuration: int + +includeBaseline: bool + +id: String - - - +Widget build() + + + +StudySchedule toStudySchedule() + +Study apply() + +StudyScheduleFormData copy() - - - - + + + + - - - DisabledFrame + + + InterventionFormView - - - +Widget build() + + + +formViewModel: InterventionFormViewModel - - - - - + + + + + - - - PhoneContainer + + + InterventionTaskFormData - - - <static>+defaultWidth: double - <static>+defaultHeight: double - +width: double - +height: double - +borderColor: Color - +borderWidth: double - +borderRadius: double - +innerContent: Widget - +innerContentBackgroundColor: Color? + + + +taskId: String + +taskTitle: String + +taskDescription: String? + <static>+kDefaultTitle: String + +id: String - - - +Widget build() + + + +CheckmarkTask toTask() + +InterventionTaskFormData copy() - - - - + + + + + - - - MobileFrame + + + InterventionPreview - - - +Widget build() + + + +routeArgs: InterventionFormRouteArgs - - - - - - - - - DesktopFrame + + + +Widget build() - - - +Widget build() + + + + + + + + InterventionFormRouteArgs - - - - + + + + - - - StudiesFilter + + + InterventionTaskFormView - - - +index: int - <static>+values: List<StudiesFilter> + + + +formViewModel: InterventionTaskFormViewModel - - - - - + + + + + - - - DashboardScaffold + + + InterventionTaskFormViewModel - - - +body: Widget + + + +taskIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +taskTitleControl: FormControl<String> + +taskDescriptionControl: FormControl<String> + +markAsCompletedControl: FormControl<bool> + +form: FormGroup + +taskId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +titles: Map<FormMode, String> - - - +Widget build() + + + +void setControlsFrom() + +InterventionTaskFormData buildFormData() + +InterventionTaskFormViewModel createDuplicate() - - - - - - - - - StudiesTable - - + + + + + - - - +studies: List<Study> - +onSelect: void Function(Study) - +getActions: List<ModelAction<dynamic>> Function(Study) - +emptyWidget: Widget + + + InterventionsFormData - - - +Widget build() - -List<Widget> _buildRow() + + + +interventionsData: List<InterventionFormData> + +studyScheduleData: StudyScheduleFormData + +id: String - - - - - - - - void Function(Study) + + + +Study apply() + +InterventionsFormData copy() - - - + + + + + - - - List<ModelAction<dynamic>> Function(Study) + + + InterventionFormData - - - - - - - - - DashboardScreen + + + +interventionId: String + +title: String + +description: String? + +tasksData: List<InterventionTaskFormData>? + +iconName: String? + <static>+kDefaultTitle: String + +id: String - - - +filter: StudiesFilter? + + + +Intervention toIntervention() + +InterventionFormData copy() - - - - - - - - - DashboardController - - + + + + - - - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +router: GoRouter - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + + + AccountSettingsDialog - - - -dynamic _subscribeStudies() - +dynamic setStudiesFilter() - +dynamic onSelectStudy() - +dynamic onClickNewStudy() - +List<ModelAction<dynamic>> availableActions() - +void dispose() + + + +Widget build() - - - - + + + + - - - StudyMonitorScreen + + + AppStatus - - - +Widget build() + + + +index: int + <static>+values: List<AppStatus> + <static>+initializing: AppStatus + <static>+initialized: AppStatus - - - - + + + + - - - AccountSettingsDialog + + + IAppDelegate - - - +Widget build() + + + +dynamic onAppStart() - - - + + + + + - - - App + + + AppController - - - - + + + +sharedPreferences: SharedPreferences + +appDelegates: List<IAppDelegate> + -_delayedFuture: dynamic + +isInitialized: dynamic + + - - - AppContent + + + +dynamic onAppStart() + -dynamic _callDelegates() diff --git a/docs/uml/designer_v2/lib/repositories/uml.svg b/docs/uml/designer_v2/lib/repositories/uml.svg index 8dd0e0247..712cf0b22 100644 --- a/docs/uml/designer_v2/lib/repositories/uml.svg +++ b/docs/uml/designer_v2/lib/repositories/uml.svg @@ -1,8 +1,20 @@ - - [StudyLaunched + + [<abstract>IAppRepository + | + +dynamic fetchAppConfig(); + +void dispose() ] - [<abstract>ModelEvent]<:-[StudyLaunched] + [AppRepository + | + +apiClient: StudyUApi + | + +dynamic fetchAppConfig(); + +void dispose() + ] + + [AppRepository]o-[<abstract>StudyUApi] + [<abstract>IAppRepository]<:--[AppRepository] [<abstract>IStudyRepository | @@ -16,7 +28,8 @@ | +apiClient: StudyUApi; +authRepository: IAuthRepository; - +ref: ProviderRef<dynamic> + +ref: ProviderRef<dynamic>; + +sortCallback: void Function()? | +String getKey(); +dynamic deleteParticipants(); @@ -27,6 +40,7 @@ [StudyRepository]o-[<abstract>StudyUApi] [StudyRepository]o-[<abstract>IAuthRepository] [StudyRepository]o-[<abstract>ProviderRef] + [StudyRepository]o-[void Function()?] [<abstract>ModelRepository]<:-[StudyRepository] [<abstract>IStudyRepository]<:--[StudyRepository] @@ -48,48 +62,50 @@ [StudyRepositoryDelegate]o-[<abstract>IAuthRepository] [<abstract>IModelRepositoryDelegate]<:-[StudyRepositoryDelegate] - [<abstract>ModelEvent + [<abstract>IUserRepository | - +modelId: String; - +model: T - ] - - [IsFetched - ] - - [<abstract>ModelEvent]<:-[IsFetched] - - [IsSaving - ] - - [<abstract>ModelEvent]<:-[IsSaving] - - [IsSaved + +user: StudyUUser + | + +dynamic fetchUser(); + +dynamic saveUser(); + +dynamic updatePreferences() ] - [<abstract>ModelEvent]<:-[IsSaved] + [<abstract>IUserRepository]o-[StudyUUser] - [IsDeleted + [UserRepository + | + +apiClient: StudyUApi; + +authRepository: IAuthRepository; + +ref: Ref<Object?>; + +user: StudyUUser + | + +dynamic fetchUser(); + +dynamic saveUser(); + +dynamic updatePreferences() ] - [<abstract>ModelEvent]<:-[IsDeleted] + [UserRepository]o-[<abstract>StudyUApi] + [UserRepository]o-[<abstract>IAuthRepository] + [UserRepository]o-[<abstract>Ref] + [UserRepository]o-[StudyUUser] + [<abstract>IUserRepository]<:--[UserRepository] - [<abstract>IAppRepository + [PreferenceAction | - +dynamic fetchAppConfig(); - +void dispose() + +index: int; + <static>+values: List<PreferenceAction>; + <static>+pin: PreferenceAction; + <static>+pinOff: PreferenceAction ] - [AppRepository - | - +apiClient: StudyUApi - | - +dynamic fetchAppConfig(); - +void dispose() + [PreferenceAction]o-[PreferenceAction] + [Enum]<:--[PreferenceAction] + + [StudyLaunched ] - [AppRepository]o-[<abstract>StudyUApi] - [<abstract>IAppRepository]<:--[AppRepository] + [<abstract>ModelEvent]<:-[StudyLaunched] [WrappedModel | @@ -187,94 +203,107 @@ [<abstract>ModelRepository]o-[BehaviorSubject] [<abstract>IModelRepository]<:-[<abstract>ModelRepository] - [<abstract>StudyUApi + [<abstract>ModelEvent | - +dynamic saveStudy(); - +dynamic fetchStudy(); - +dynamic getUserStudies(); - +dynamic deleteStudy(); - +dynamic saveStudyInvite(); - +dynamic fetchStudyInvite(); - +dynamic deleteStudyInvite(); - +dynamic deleteParticipants(); - +dynamic fetchAppConfig() - ] - - [APIException + +modelId: String; + +model: T ] - [Exception]<:--[APIException] - - [StudyNotFoundException + [IsFetched ] - [APIException]<:-[StudyNotFoundException] + [<abstract>ModelEvent]<:-[IsFetched] - [MeasurementNotFoundException + [IsSaving ] - [APIException]<:-[MeasurementNotFoundException] + [<abstract>ModelEvent]<:-[IsSaving] - [QuestionNotFoundException + [IsSaved ] - [APIException]<:-[QuestionNotFoundException] + [<abstract>ModelEvent]<:-[IsSaved] - [ConsentItemNotFoundException + [IsDeleted ] - [APIException]<:-[ConsentItemNotFoundException] + [<abstract>ModelEvent]<:-[IsDeleted] - [InterventionNotFoundException + [<abstract>SupabaseClientDependant + | + +supabaseClient: SupabaseClient ] - [APIException]<:-[InterventionNotFoundException] + [<abstract>SupabaseClientDependant]o-[SupabaseClient] - [InterventionTaskNotFoundException + [SupabaseQueryError + | + +statusCode: String?; + +message: String; + +details: dynamic ] - [APIException]<:-[InterventionTaskNotFoundException] + [Exception]<:--[SupabaseQueryError] - [ReportNotFoundException + [<abstract>SupabaseQueryMixin + | + +dynamic deleteAll(); + +dynamic getAll(); + +dynamic getById(); + +dynamic getByColumn(); + +List<T> deserializeList(); + +T deserializeObject() ] - [APIException]<:-[ReportNotFoundException] - - [ReportSectionNotFoundException + [<abstract>IInviteCodeRepository + | + +dynamic isCodeAlreadyUsed() ] - [APIException]<:-[ReportSectionNotFoundException] + [<abstract>ModelRepository]<:--[<abstract>IInviteCodeRepository] - [StudyInviteNotFoundException + [InviteCodeRepository + | + +studyId: String; + +ref: ProviderRef<dynamic>; + +apiClient: StudyUApi; + +authRepository: IAuthRepository; + +studyRepository: IStudyRepository; + +study: Study + | + +String getKey(); + +dynamic isCodeAlreadyUsed(); + +List<ModelAction<dynamic>> availableActions(); + +dynamic emitUpdate() ] - [APIException]<:-[StudyInviteNotFoundException] + [InviteCodeRepository]o-[<abstract>ProviderRef] + [InviteCodeRepository]o-[<abstract>StudyUApi] + [InviteCodeRepository]o-[<abstract>IAuthRepository] + [InviteCodeRepository]o-[<abstract>IStudyRepository] + [InviteCodeRepository]o-[Study] + [<abstract>ModelRepository]<:-[InviteCodeRepository] + [<abstract>IInviteCodeRepository]<:--[InviteCodeRepository] - [StudyUApiClient + [InviteCodeRepositoryDelegate | - +supabaseClient: SupabaseClient; - <static>+studyColumns: List<String>; - <static>+studyWithParticipantActivityColumns: List<String>; - +testDelayMilliseconds: int + +study: Study; + +apiClient: StudyUApi; + +studyRepository: IStudyRepository | - +dynamic deleteParticipants(); - +dynamic getUserStudies(); - +dynamic fetchStudy(); - +dynamic deleteStudy(); - +dynamic saveStudy(); - +dynamic fetchStudyInvite(); - +dynamic saveStudyInvite(); - +dynamic deleteStudyInvite(); - +dynamic fetchAppConfig(); - -dynamic _awaitGuarded(); - -dynamic _apiException(); - -dynamic _testDelay() + +dynamic fetch(); + +dynamic fetchAll(); + +dynamic save(); + +dynamic delete(); + +dynamic onError(); + +StudyInvite createDuplicate(); + +StudyInvite createNewInstance() ] - [StudyUApiClient]o-[SupabaseClient] - [<abstract>SupabaseClientDependant]<:-[StudyUApiClient] - [<abstract>SupabaseQueryMixin]<:-[StudyUApiClient] - [<abstract>StudyUApi]<:--[StudyUApiClient] + [InviteCodeRepositoryDelegate]o-[Study] + [InviteCodeRepositoryDelegate]o-[<abstract>StudyUApi] + [InviteCodeRepositoryDelegate]o-[<abstract>IStudyRepository] + [<abstract>IModelRepositoryDelegate]<:-[InviteCodeRepositoryDelegate] [<abstract>IAuthRepository | @@ -326,328 +355,431 @@ [AuthRepository]o-[User] [<abstract>IAuthRepository]<:--[AuthRepository] - [<abstract>IInviteCodeRepository + [<abstract>StudyUApi | - +dynamic isCodeAlreadyUsed() + +dynamic saveStudy(); + +dynamic fetchStudy(); + +dynamic getUserStudies(); + +dynamic deleteStudy(); + +dynamic saveStudyInvite(); + +dynamic fetchStudyInvite(); + +dynamic deleteStudyInvite(); + +dynamic deleteParticipants(); + +dynamic fetchAppConfig(); + +dynamic fetchUser(); + +dynamic saveUser() ] - [<abstract>ModelRepository]<:--[<abstract>IInviteCodeRepository] + [APIException + ] - [InviteCodeRepository - | - +studyId: String; - +ref: ProviderRef<dynamic>; - +apiClient: StudyUApi; - +authRepository: IAuthRepository; - +studyRepository: IStudyRepository; - +study: Study - | - +String getKey(); - +dynamic isCodeAlreadyUsed(); - +List<ModelAction<dynamic>> availableActions(); - +dynamic emitUpdate() + [Exception]<:--[APIException] + + [StudyNotFoundException ] - [InviteCodeRepository]o-[<abstract>ProviderRef] - [InviteCodeRepository]o-[<abstract>StudyUApi] - [InviteCodeRepository]o-[<abstract>IAuthRepository] - [InviteCodeRepository]o-[<abstract>IStudyRepository] - [InviteCodeRepository]o-[Study] - [<abstract>ModelRepository]<:-[InviteCodeRepository] - [<abstract>IInviteCodeRepository]<:--[InviteCodeRepository] + [APIException]<:-[StudyNotFoundException] - [InviteCodeRepositoryDelegate - | - +study: Study; - +apiClient: StudyUApi; - +studyRepository: IStudyRepository - | - +dynamic fetch(); - +dynamic fetchAll(); - +dynamic save(); - +dynamic delete(); - +dynamic onError(); - +StudyInvite createDuplicate(); - +StudyInvite createNewInstance() + [MeasurementNotFoundException ] - [InviteCodeRepositoryDelegate]o-[Study] - [InviteCodeRepositoryDelegate]o-[<abstract>StudyUApi] - [InviteCodeRepositoryDelegate]o-[<abstract>IStudyRepository] - [<abstract>IModelRepositoryDelegate]<:-[InviteCodeRepositoryDelegate] + [APIException]<:-[MeasurementNotFoundException] - [<abstract>SupabaseClientDependant - | - +supabaseClient: SupabaseClient + [QuestionNotFoundException ] - [<abstract>SupabaseClientDependant]o-[SupabaseClient] + [APIException]<:-[QuestionNotFoundException] - [SupabaseQueryError - | - +statusCode: String?; - +message: String; - +details: dynamic + [ConsentItemNotFoundException ] - [Exception]<:--[SupabaseQueryError] + [APIException]<:-[ConsentItemNotFoundException] - [<abstract>SupabaseQueryMixin - | - +dynamic deleteAll(); - +dynamic getAll(); - +dynamic getById(); - +dynamic getByColumn(); - +List<T> deserializeList(); - +T deserializeObject() + [InterventionNotFoundException ] - - + [APIException]<:-[InterventionNotFoundException] + + [InterventionTaskNotFoundException + ] + + [APIException]<:-[InterventionTaskNotFoundException] + + [ReportNotFoundException + ] + + [APIException]<:-[ReportNotFoundException] + + [ReportSectionNotFoundException + ] + + [APIException]<:-[ReportSectionNotFoundException] + + [StudyInviteNotFoundException + ] + + [APIException]<:-[StudyInviteNotFoundException] + + [UserNotFoundException + ] + + [APIException]<:-[UserNotFoundException] + + [StudyUApiClient + | + +supabaseClient: SupabaseClient; + <static>+studyColumns: List<String>; + <static>+studyWithParticipantActivityColumns: List<String>; + +testDelayMilliseconds: int + | + +dynamic deleteParticipants(); + +dynamic getUserStudies(); + +dynamic fetchStudy(); + +dynamic deleteStudy(); + +dynamic saveStudy(); + +dynamic fetchStudyInvite(); + +dynamic saveStudyInvite(); + +dynamic deleteStudyInvite(); + +dynamic fetchAppConfig(); + +dynamic fetchUser(); + +dynamic saveUser(); + -dynamic _awaitGuarded(); + -dynamic _apiException(); + -dynamic _testDelay() + ] + + [StudyUApiClient]o-[SupabaseClient] + [<abstract>SupabaseClientDependant]<:-[StudyUApiClient] + [<abstract>SupabaseQueryMixin]<:-[StudyUApiClient] + [<abstract>StudyUApi]<:--[StudyUApiClient] + + + - + - - + + + + + + + + - + + + + + + - - + - + - + - + - + - + - - + + - + - - + + - + - + - - - - - - - - - - - - - + + + + + - + - - + + + - - + - + - - + + + - - - + + + - - + - - + + - + + + + - + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - - - - + - + - - + + - + - + + + + + + + + + + + + + + + - + - - - + + + + + + + + + - + - + - + - + - + - + - + - + - + + + - + - - - + + + + - - + - + - + - + - + + + - + - + - + - + + + - + - - - - + + + - - + - + - + - + - + - + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + - + - - - - + + + + + - - - StudyLaunched + + + IAppRepository + + + + + + +dynamic fetchAppConfig() + +void dispose() - - - - + + + + + - - - ModelEvent + + + AppRepository - - - +modelId: String - +model: T + + + +apiClient: StudyUApi + + + + + + +dynamic fetchAppConfig() + +void dispose() + + + + + + + + + + + + StudyUApi + + + + + + +dynamic saveStudy() + +dynamic fetchStudy() + +dynamic getUserStudies() + +dynamic deleteStudy() + +dynamic saveStudyInvite() + +dynamic fetchStudyInvite() + +dynamic deleteStudyInvite() + +dynamic deleteParticipants() + +dynamic fetchAppConfig() + +dynamic fetchUser() + +dynamic saveUser() - - + + - + IStudyRepository - + +dynamic launch() +dynamic deleteParticipants() @@ -657,17 +789,17 @@ - - - + + + - + ModelRepository - + +delegate: IModelRepositoryDelegate<T> -_allModelsStreamController: BehaviorSubject<List<WrappedModel<T>>> @@ -678,7 +810,7 @@ - + +WrappedModel<T>? get() +dynamic fetchAll() @@ -706,25 +838,26 @@ - - - + + + - + StudyRepository - + +apiClient: StudyUApi +authRepository: IAuthRepository +ref: ProviderRef<dynamic> + +sortCallback: void Function()? - + +String getKey() +dynamic deleteParticipants() @@ -734,45 +867,19 @@ - - - - - - - - StudyUApi - - - - - - +dynamic saveStudy() - +dynamic fetchStudy() - +dynamic getUserStudies() - +dynamic deleteStudy() - +dynamic saveStudyInvite() - +dynamic fetchStudyInvite() - +dynamic deleteStudyInvite() - +dynamic deleteParticipants() - +dynamic fetchAppConfig() - - - - - - - + + + - + IAuthRepository - + +allowPasswordReset: bool +currentUser: User? @@ -781,7 +888,7 @@ - + +dynamic signUp() +dynamic signInWith() @@ -795,35 +902,46 @@ - + - + ProviderRef + + + + + + + void Function()? + + + + - - - + + + - + StudyRepositoryDelegate - + +apiClient: StudyUApi +authRepository: IAuthRepository - + +dynamic fetchAll() +dynamic fetch() @@ -838,16 +956,16 @@ - - + + - + IModelRepositoryDelegate - + +dynamic fetchAll() +dynamic fetch() @@ -860,108 +978,160 @@ - - - + + + + + - - - IsFetched + + + IUserRepository + + + + + + +user: StudyUUser + + + + + + +dynamic fetchUser() + +dynamic saveUser() + +dynamic updatePreferences() - - - + + + - - - IsSaving + + + StudyUUser - - - + + + + + - - - IsSaved + + + UserRepository + + + + + + +apiClient: StudyUApi + +authRepository: IAuthRepository + +ref: Ref<Object?> + +user: StudyUUser + + + + + + +dynamic fetchUser() + +dynamic saveUser() + +dynamic updatePreferences() - - - + + + - - - IsDeleted + + + Ref - - - - + + + + - - - IAppRepository + + + PreferenceAction - - - +dynamic fetchAppConfig() - +void dispose() + + + +index: int + <static>+values: List<PreferenceAction> + <static>+pin: PreferenceAction + <static>+pinOff: PreferenceAction - - - - - + + + - - - AppRepository + + + Enum - - - +apiClient: StudyUApi + + + + + + + + StudyLaunched - - - +dynamic fetchAppConfig() - +void dispose() + + + + + + + + + ModelEvent + + + + + + +modelId: String + +model: T - - - + + + - + WrappedModel - + -_model: T +asyncValue: AsyncValue<T> @@ -975,7 +1145,7 @@ - + +dynamic markWithError() +dynamic markAsLoading() @@ -987,9 +1157,9 @@ - + - + AsyncValue @@ -998,9 +1168,9 @@ - + - + ModelRepositoryException @@ -1009,9 +1179,9 @@ - + - + Exception @@ -1020,9 +1190,9 @@ - + - + ModelNotFoundException @@ -1031,16 +1201,16 @@ - - + + - + IModelRepository - + +String getKey() +WrappedModel<T>? get() @@ -1062,9 +1232,9 @@ - + - + IModelActionProvider @@ -1073,221 +1243,231 @@ - + - + BehaviorSubject - - - + + + - - - APIException + + + IsFetched - - - + + + - - - StudyNotFoundException + + + IsSaving - - - + + + - - - MeasurementNotFoundException + + + IsSaved - - - + + + - - - QuestionNotFoundException + + + IsDeleted - - - + + + + - - - ConsentItemNotFoundException + + + SupabaseClientDependant - - - - - - - - InterventionNotFoundException + + + +supabaseClient: SupabaseClient - - - + + + - - - InterventionTaskNotFoundException + + + SupabaseClient - - - + + + + - - - ReportNotFoundException + + + SupabaseQueryError - - - - - - - - ReportSectionNotFoundException + + + +statusCode: String? + +message: String + +details: dynamic - - - + + + + - - - StudyInviteNotFoundException + + + SupabaseQueryMixin - - - - - - - - - - StudyUApiClient + + + +dynamic deleteAll() + +dynamic getAll() + +dynamic getById() + +dynamic getByColumn() + +List<T> deserializeList() + +T deserializeObject() - - - +supabaseClient: SupabaseClient - <static>+studyColumns: List<String> - <static>+studyWithParticipantActivityColumns: List<String> - +testDelayMilliseconds: int + + + + + + + + + IInviteCodeRepository - - - +dynamic deleteParticipants() - +dynamic getUserStudies() - +dynamic fetchStudy() - +dynamic deleteStudy() - +dynamic saveStudy() - +dynamic fetchStudyInvite() - +dynamic saveStudyInvite() - +dynamic deleteStudyInvite() - +dynamic fetchAppConfig() - -dynamic _awaitGuarded() - -dynamic _apiException() - -dynamic _testDelay() + + + +dynamic isCodeAlreadyUsed() - - - + + + + + - - - SupabaseClient + + + InviteCodeRepository - - - - - + + + +studyId: String + +ref: ProviderRef<dynamic> + +apiClient: StudyUApi + +authRepository: IAuthRepository + +studyRepository: IStudyRepository + +study: Study + + - - - SupabaseClientDependant + + + +String getKey() + +dynamic isCodeAlreadyUsed() + +List<ModelAction<dynamic>> availableActions() + +dynamic emitUpdate() - - - +supabaseClient: SupabaseClient + + + + + + + + Study - - - - + + + + + - - - SupabaseQueryMixin + + + InviteCodeRepositoryDelegate - - - +dynamic deleteAll() - +dynamic getAll() - +dynamic getById() - +dynamic getByColumn() - +List<T> deserializeList() - +T deserializeObject() + + + +study: Study + +apiClient: StudyUApi + +studyRepository: IStudyRepository + + + + + + +dynamic fetch() + +dynamic fetchAll() + +dynamic save() + +dynamic delete() + +dynamic onError() + +StudyInvite createDuplicate() + +StudyInvite createNewInstance() - + - + User @@ -1296,9 +1476,9 @@ - + - + Session @@ -1307,9 +1487,9 @@ - + - + IAppDelegate @@ -1318,17 +1498,17 @@ - - - + + + - + AuthRepository - + <static>+PERSIST_SESSION_KEY: String +supabaseClient: SupabaseClient @@ -1341,7 +1521,7 @@ - + -void _registerAuthListener() +dynamic signUp() @@ -1360,9 +1540,9 @@ - + - + SharedPreferences @@ -1371,126 +1551,173 @@ - + - + GoTrueClient - - - - + + + - - - IInviteCodeRepository + + + APIException - - - +dynamic isCodeAlreadyUsed() + + + + + + + + StudyNotFoundException - - - - - + + + - - - InviteCodeRepository + + + MeasurementNotFoundException - - - +studyId: String - +ref: ProviderRef<dynamic> - +apiClient: StudyUApi - +authRepository: IAuthRepository - +studyRepository: IStudyRepository - +study: Study + + + + + + + + QuestionNotFoundException - - - +String getKey() - +dynamic isCodeAlreadyUsed() - +List<ModelAction<dynamic>> availableActions() - +dynamic emitUpdate() + + + + + + + + ConsentItemNotFoundException - - - + + + - - - Study + + + InterventionNotFoundException - - - - - + + + - - - InviteCodeRepositoryDelegate + + + InterventionTaskNotFoundException - - - +study: Study - +apiClient: StudyUApi - +studyRepository: IStudyRepository + + + + + + + + ReportNotFoundException - - - +dynamic fetch() - +dynamic fetchAll() - +dynamic save() - +dynamic delete() - +dynamic onError() - +StudyInvite createDuplicate() - +StudyInvite createNewInstance() + + + + + + + + ReportSectionNotFoundException - - - - + + + - - - SupabaseQueryError + + + StudyInviteNotFoundException - - - +statusCode: String? - +message: String - +details: dynamic + + + + + + + + UserNotFoundException + + + + + + + + + + + + + StudyUApiClient + + + + + + +supabaseClient: SupabaseClient + <static>+studyColumns: List<String> + <static>+studyWithParticipantActivityColumns: List<String> + +testDelayMilliseconds: int + + + + + + +dynamic deleteParticipants() + +dynamic getUserStudies() + +dynamic fetchStudy() + +dynamic deleteStudy() + +dynamic saveStudy() + +dynamic fetchStudyInvite() + +dynamic saveStudyInvite() + +dynamic deleteStudyInvite() + +dynamic fetchAppConfig() + +dynamic fetchUser() + +dynamic saveUser() + -dynamic _awaitGuarded() + -dynamic _apiException() + -dynamic _testDelay() diff --git a/docs/uml/designer_v2/lib/uml.svg b/docs/uml/designer_v2/lib/uml.svg index 36b675306..331385868 100644 --- a/docs/uml/designer_v2/lib/uml.svg +++ b/docs/uml/designer_v2/lib/uml.svg @@ -1,2424 +1,2217 @@ - - [NotificationDispatcher + + [Assets | - +child: Widget?; - +snackbarInnerPadding: double; - +snackbarWidth: double?; - +snackbarBehavior: SnackBarBehavior; - +snackbarDefaultDuration: int - ] - - [NotificationDispatcher]o-[<abstract>Widget] - [NotificationDispatcher]o-[SnackBarBehavior] - - [<abstract>IClipboardService - | - +dynamic copy() + <static>+logoWide: String ] - [ClipboardService + [Config | - +dynamic copy() + <static>+isDebugMode: bool; + <static>+defaultLocale: Set<String>; + <static>+supportedLocales: Map<String, String>; + <static>+newStudyId: String; + <static>+newModelId: String; + <static>+minSplashTime: int; + <static>+formAutosaveDebounce: int ] - [<abstract>IClipboardService]<:--[ClipboardService] - - [<abstract>INotificationService + [<abstract>IAppRepository | - +void showMessage(); - +void show(); - +Stream<NotificationIntent> watchNotifications(); + +dynamic fetchAppConfig(); +void dispose() ] - [NotificationService + [AppRepository | - -_streamController: BehaviorSubject<NotificationIntent> + +apiClient: StudyUApi | - +Stream<NotificationIntent> watchNotifications(); - +void showMessage(); - +void show(); + +dynamic fetchAppConfig(); +void dispose() ] - [NotificationService]o-[BehaviorSubject] - [<abstract>INotificationService]<:--[NotificationService] + [AppRepository]o-[<abstract>StudyUApi] + [<abstract>IAppRepository]<:--[AppRepository] - [Notifications + [<abstract>IStudyRepository | - <static>+passwordReset: SnackbarIntent; - <static>+passwordResetSuccess: SnackbarIntent; - <static>+studyDeleted: SnackbarIntent; - <static>+inviteCodeDeleted: SnackbarIntent; - <static>+inviteCodeClipped: SnackbarIntent; - <static>+studyDeleteConfirmation: AlertIntent + +dynamic launch(); + +dynamic deleteParticipants() ] - [Notifications]o-[SnackbarIntent] - [Notifications]o-[AlertIntent] + [<abstract>ModelRepository]<:--[<abstract>IStudyRepository] - [NotificationDefaultActions + [StudyRepository | - <static>+cancel: NotificationAction + +apiClient: StudyUApi; + +authRepository: IAuthRepository; + +ref: ProviderRef<dynamic>; + +sortCallback: void Function()? + | + +String getKey(); + +dynamic deleteParticipants(); + +dynamic launch(); + +List<ModelAction<dynamic>> availableActions() ] - [NotificationDefaultActions]o-[NotificationAction] + [StudyRepository]o-[<abstract>StudyUApi] + [StudyRepository]o-[<abstract>IAuthRepository] + [StudyRepository]o-[<abstract>ProviderRef] + [StudyRepository]o-[void Function()?] + [<abstract>ModelRepository]<:-[StudyRepository] + [<abstract>IStudyRepository]<:--[StudyRepository] - [<abstract>NotificationIntent + [StudyRepositoryDelegate | - +message: String?; - +customContent: Widget?; - +icon: IconData?; - +actions: List<NotificationAction>?; - +type: NotificationType + +apiClient: StudyUApi; + +authRepository: IAuthRepository | - +void register() + +dynamic fetchAll(); + +dynamic fetch(); + +dynamic save(); + +dynamic delete(); + +dynamic onError(); + +Study createNewInstance(); + +Study createDuplicate() ] - [<abstract>NotificationIntent]o-[<abstract>Widget] - [<abstract>NotificationIntent]o-[IconData] - [<abstract>NotificationIntent]o-[NotificationType] + [StudyRepositoryDelegate]o-[<abstract>StudyUApi] + [StudyRepositoryDelegate]o-[<abstract>IAuthRepository] + [<abstract>IModelRepositoryDelegate]<:-[StudyRepositoryDelegate] - [NotificationAction + [<abstract>IUserRepository | - +label: String; - +onSelect: dynamic Function(); - +isDestructive: bool - ] - - [NotificationAction]o-[dynamic Function()] - - [SnackbarIntent + +user: StudyUUser | - +duration: int? + +dynamic fetchUser(); + +dynamic saveUser(); + +dynamic updatePreferences() ] - [<abstract>NotificationIntent]<:-[SnackbarIntent] + [<abstract>IUserRepository]o-[StudyUUser] - [AlertIntent + [UserRepository | - +title: String; - +dismissOnAction: bool; - +isDestructive: dynamic + +apiClient: StudyUApi; + +authRepository: IAuthRepository; + +ref: Ref<Object?>; + +user: StudyUUser + | + +dynamic fetchUser(); + +dynamic saveUser(); + +dynamic updatePreferences() ] - [<abstract>NotificationIntent]<:-[AlertIntent] + [UserRepository]o-[<abstract>StudyUApi] + [UserRepository]o-[<abstract>IAuthRepository] + [UserRepository]o-[<abstract>Ref] + [UserRepository]o-[StudyUUser] + [<abstract>IUserRepository]<:--[UserRepository] - [NotificationType + [PreferenceAction | +index: int; - <static>+values: List<NotificationType>; - <static>+snackbar: NotificationType; - <static>+alert: NotificationType; - <static>+custom: NotificationType + <static>+values: List<PreferenceAction>; + <static>+pin: PreferenceAction; + <static>+pinOff: PreferenceAction ] - [NotificationType]o-[NotificationType] - [Enum]<:--[NotificationType] + [PreferenceAction]o-[PreferenceAction] + [Enum]<:--[PreferenceAction] - [DropdownMenuItemTheme - | - +iconTheme: IconThemeData? + [StudyLaunched ] - [DropdownMenuItemTheme]o-[IconThemeData] - [<abstract>Diagnosticable]<:-[DropdownMenuItemTheme] + [<abstract>ModelEvent]<:-[StudyLaunched] - [ThemeConfig - | - <static>+kMinContentWidth: double; - <static>+kMaxContentWidth: double; - <static>+kHoverFadeFactor: double; - <static>+kMuteFadeFactor: double + [WrappedModel | - <static>+dynamic bodyBackgroundColor(); - <static>+Color modalBarrierColor(); - <static>+Color containerColor(); - <static>+Color colorPickerInitialColor(); - <static>+TextStyle bodyTextMuted(); - <static>+TextStyle bodyTextBackground(); - <static>+double iconSplashRadius(); - <static>+Color sidesheetBackgroundColor(); - <static>+InputDecorationTheme dropdownInputDecorationTheme(); - <static>+DropdownMenuItemTheme dropdownMenuItemTheme() - ] - - [NoAnimationPageTransitionsBuilder + -_model: T; + +asyncValue: AsyncValue<T>; + +isLocalOnly: bool; + +isDirty: bool; + +isDeleted: bool; + +lastSaved: DateTime?; + +lastFetched: DateTime?; + +lastUpdated: DateTime?; + +model: T | - +Widget buildTransitions() + +dynamic markWithError(); + +dynamic markAsLoading(); + +dynamic markAsFetched(); + +dynamic markAsSaved() ] - [<abstract>PageTransitionsBuilder]<:-[NoAnimationPageTransitionsBuilder] + [WrappedModel]o-[<abstract>AsyncValue] - [WebTransitionBuilder - | - +Widget buildTransitions() + [ModelRepositoryException ] - [<abstract>PageTransitionsBuilder]<:-[WebTransitionBuilder] + [Exception]<:--[ModelRepositoryException] - [ThemeSettingChange - | - +settings: ThemeSettings + [ModelNotFoundException ] - [ThemeSettingChange]o-[ThemeSettings] - [<abstract>Notification]<:-[ThemeSettingChange] + [ModelRepositoryException]<:--[ModelNotFoundException] - [ThemeProvider - | - +settings: ValueNotifier<ThemeSettings>; - +lightDynamic: ColorScheme?; - +darkDynamic: ColorScheme?; - +pageTransitionsTheme: PageTransitionsTheme; - +shapeMedium: ShapeBorder + [<abstract>IModelRepository | - +Color custom(); - +Color blend(); - +Color source(); - +ColorScheme colors(); - +CardTheme cardTheme(); - +ListTileThemeData listTileTheme(); - +AppBarTheme appBarTheme(); - +SnackBarThemeData snackBarThemeData(); - +TabBarTheme tabBarTheme(); - +BottomAppBarTheme bottomAppBarTheme(); - +BottomNavigationBarThemeData bottomNavigationBarTheme(); - +SwitchThemeData switchTheme(); - +InputDecorationTheme inputDecorationTheme(); - +TextTheme textTheme(); - +DividerThemeData dividerTheme(); - +NavigationRailThemeData navigationRailTheme(); - +DrawerThemeData drawerTheme(); - +IconThemeData iconTheme(); - +CheckboxThemeData checkboxTheme(); - +RadioThemeData radioTheme(); - +TooltipThemeData tooltipTheme(); - +ThemeData light(); - +ThemeData dark(); - +ThemeMode themeMode(); - +ThemeData theme(); - <static>+ThemeProvider of(); - +bool updateShouldNotify() + +String getKey(); + +WrappedModel<T>? get(); + +dynamic fetchAll(); + +dynamic fetch(); + +dynamic save(); + +dynamic delete(); + +dynamic duplicateAndSave(); + +dynamic duplicateAndSaveFromRemote(); + +Stream<WrappedModel<T>> watch(); + +Stream<List<WrappedModel<T>>> watchAll(); + +Stream<ModelEvent<T>> watchChanges(); + +Stream<ModelEvent<T>> watchAllChanges(); + +dynamic ensurePersisted(); + +void dispose() ] - [ThemeProvider]o-[ValueNotifier] - [ThemeProvider]o-[ColorScheme] - [ThemeProvider]o-[PageTransitionsTheme] - [ThemeProvider]o-[<abstract>ShapeBorder] - [<abstract>InheritedWidget]<:-[ThemeProvider] + [<abstract>IModelActionProvider]<:--[<abstract>IModelRepository] - [ThemeSettings + [<abstract>IModelRepositoryDelegate | - +sourceColor: Color; - +themeMode: ThemeMode + +dynamic fetchAll(); + +dynamic fetch(); + +dynamic save(); + +dynamic delete(); + +T createNewInstance(); + +T createDuplicate(); + +dynamic onError() ] - [ThemeSettings]o-[Color] - [ThemeSettings]o-[ThemeMode] - - [CustomColor - | - +name: String; - +color: Color; - +blend: bool + [<abstract>ModelRepository | - +Color value() - ] - - [CustomColor]o-[Color] - - [LanguagePicker + +delegate: IModelRepositoryDelegate<T>; + -_allModelsStreamController: BehaviorSubject<List<WrappedModel<T>>>; + -_allModelEventsStreamController: BehaviorSubject<ModelEvent<T>>; + +modelStreamControllers: Map<String, BehaviorSubject<WrappedModel<T>>>; + +modelEventsStreamControllers: Map<String, BehaviorSubject<ModelEvent<T>>>; + -_allModels: Map<String, WrappedModel<T>> | - +languagePickerType: LanguagePickerType; - +iconColor: Color?; - +offset: Offset? + +WrappedModel<T>? get(); + +dynamic fetchAll(); + +dynamic fetch(); + +dynamic save(); + +dynamic delete(); + +dynamic duplicateAndSave(); + +dynamic duplicateAndSaveFromRemote(); + +Stream<List<WrappedModel<T>>> watchAll(); + +Stream<WrappedModel<T>> watch(); + +Stream<ModelEvent<T>> watchAllChanges(); + +Stream<ModelEvent<T>> watchChanges(); + -dynamic _buildModelSpecificController(); + +dynamic ensurePersisted(); + +WrappedModel<T> upsertLocally(); + +List<WrappedModel<T>> upsertAllLocally(); + +dynamic emitUpdate(); + +dynamic emitModelEvent(); + +dynamic emitError(); + +void dispose(); + +List<ModelAction<dynamic>> availableActions() ] - [LanguagePicker]o-[LanguagePickerType] - [LanguagePicker]o-[Color] - [LanguagePicker]o-[Offset] + [<abstract>ModelRepository]o-[<abstract>IModelRepositoryDelegate] + [<abstract>ModelRepository]o-[BehaviorSubject] + [<abstract>IModelRepository]<:-[<abstract>ModelRepository] - [LanguagePickerType + [<abstract>ModelEvent | - +index: int; - <static>+values: List<LanguagePickerType>; - <static>+field: LanguagePickerType; - <static>+icon: LanguagePickerType + +modelId: String; + +model: T ] - [LanguagePickerType]o-[LanguagePickerType] - [Enum]<:--[LanguagePickerType] - - [PlatformLocaleWeb - | - +Locale getPlatformLocale() + [IsFetched ] - [<abstract>PlatformLocale]<:--[PlatformLocaleWeb] + [<abstract>ModelEvent]<:-[IsFetched] - [<abstract>PlatformLocale - | - +Locale getPlatformLocale() + [IsSaving ] - [PlatformLocaleMobile - | - +Locale getPlatformLocale() + [<abstract>ModelEvent]<:-[IsSaving] + + [IsSaved ] - [<abstract>PlatformLocale]<:--[PlatformLocaleMobile] + [<abstract>ModelEvent]<:-[IsSaved] - [AppTranslation - | - <static>+dynamic init() + [IsDeleted ] - [CountWhereValidator - | - +predicate: bool Function(T?); - +minCount: int?; - +maxCount: int?; - <static>+kValidationMessageMinCount: String; - <static>+kValidationMessageMaxCount: String + [<abstract>ModelEvent]<:-[IsDeleted] + + [<abstract>SupabaseClientDependant | - +Map<String, dynamic>? validate() + +supabaseClient: SupabaseClient ] - [CountWhereValidator]o-[bool Function(T?)] - [<abstract>Validator]<:-[CountWhereValidator] + [<abstract>SupabaseClientDependant]o-[SupabaseClient] - [MustMatchValidator - | - +control: AbstractControl<dynamic>?; - +matchingControl: AbstractControl<dynamic>? + [SupabaseQueryError | - +Map<String, dynamic>? validate() + +statusCode: String?; + +message: String; + +details: dynamic ] - [MustMatchValidator]o-[<abstract>AbstractControl] - [<abstract>Validator]<:-[MustMatchValidator] + [Exception]<:--[SupabaseQueryError] - [FieldValidators + [<abstract>SupabaseQueryMixin | - <static>+String? emailValidator() + +dynamic deleteAll(); + +dynamic getAll(); + +dynamic getById(); + +dynamic getByColumn(); + +List<T> deserializeList(); + +T deserializeObject() ] - [Patterns + [<abstract>IInviteCodeRepository | - <static>+timeFormatString: String; - <static>+emailFormatString: String; - <static>+url: String + +dynamic isCodeAlreadyUsed() ] - [Time + [<abstract>ModelRepository]<:--[<abstract>IInviteCodeRepository] + + [InviteCodeRepository | - <static>+dynamic fromTimeOfDay(); - +Map<String, dynamic> toJson(); - <static>+Time fromJson() + +studyId: String; + +ref: ProviderRef<dynamic>; + +apiClient: StudyUApi; + +authRepository: IAuthRepository; + +studyRepository: IStudyRepository; + +study: Study + | + +String getKey(); + +dynamic isCodeAlreadyUsed(); + +List<ModelAction<dynamic>> availableActions(); + +dynamic emitUpdate() ] - [TimeOfDay]<:-[Time] + [InviteCodeRepository]o-[<abstract>ProviderRef] + [InviteCodeRepository]o-[<abstract>StudyUApi] + [InviteCodeRepository]o-[<abstract>IAuthRepository] + [InviteCodeRepository]o-[<abstract>IStudyRepository] + [InviteCodeRepository]o-[Study] + [<abstract>ModelRepository]<:-[InviteCodeRepository] + [<abstract>IInviteCodeRepository]<:--[InviteCodeRepository] - [TimeValueAccessor + [InviteCodeRepositoryDelegate | - +String modelToViewValue(); - +Time? viewToModelValue(); - -String _addLeadingZeroIfNeeded() + +study: Study; + +apiClient: StudyUApi; + +studyRepository: IStudyRepository + | + +dynamic fetch(); + +dynamic fetchAll(); + +dynamic save(); + +dynamic delete(); + +dynamic onError(); + +StudyInvite createDuplicate(); + +StudyInvite createNewInstance() ] - [<abstract>ControlValueAccessor]<:-[TimeValueAccessor] + [InviteCodeRepositoryDelegate]o-[Study] + [InviteCodeRepositoryDelegate]o-[<abstract>StudyUApi] + [InviteCodeRepositoryDelegate]o-[<abstract>IStudyRepository] + [<abstract>IModelRepositoryDelegate]<:-[InviteCodeRepositoryDelegate] - [CombinedStreamNotifier + [<abstract>IAuthRepository | - -_subscriptions: List<StreamSubscription<dynamic>> + +allowPasswordReset: bool; + +currentUser: User?; + +isLoggedIn: bool; + +session: Session? | + +dynamic signUp(); + +dynamic signInWith(); + +dynamic signOut(); + +dynamic resetPasswordForEmail(); + +dynamic updateUser(); +void dispose() ] - [ChangeNotifier]<:-[CombinedStreamNotifier] + [<abstract>IAuthRepository]o-[User] + [<abstract>IAuthRepository]o-[Session] + [<abstract>IAppDelegate]<:-[<abstract>IAuthRepository] - [ModelAction + [AuthRepository | - +type: T; - +label: String; - +icon: IconData?; - +onExecute: Function; - +isAvailable: bool; - +isDestructive: bool + <static>+PERSIST_SESSION_KEY: String; + +supabaseClient: SupabaseClient; + +sharedPreferences: SharedPreferences; + +allowPasswordReset: bool; + +authClient: GoTrueClient; + +session: Session?; + +currentUser: User?; + +isLoggedIn: bool + | + -void _registerAuthListener(); + +dynamic signUp(); + +dynamic signInWith(); + +dynamic signOut(); + +dynamic resetPasswordForEmail(); + +dynamic updateUser(); + -dynamic _persistSession(); + -dynamic _resetPersistedSession(); + -dynamic _recoverSession(); + +void dispose(); + +dynamic onAppStart() ] - [ModelAction]o-[IconData] + [AuthRepository]o-[SupabaseClient] + [AuthRepository]o-[SharedPreferences] + [AuthRepository]o-[GoTrueClient] + [AuthRepository]o-[Session] + [AuthRepository]o-[User] + [<abstract>IAuthRepository]<:--[AuthRepository] - [<abstract>IModelActionProvider + [<abstract>StudyUApi | - +List<ModelAction<dynamic>> availableActions() + +dynamic saveStudy(); + +dynamic fetchStudy(); + +dynamic getUserStudies(); + +dynamic deleteStudy(); + +dynamic saveStudyInvite(); + +dynamic fetchStudyInvite(); + +dynamic deleteStudyInvite(); + +dynamic deleteParticipants(); + +dynamic fetchAppConfig(); + +dynamic fetchUser(); + +dynamic saveUser() ] - [<abstract>IListActionProvider - | - +void onSelectItem(); - +void onNewItem() + [APIException ] - [<abstract>IModelActionProvider]<:-[<abstract>IListActionProvider] + [Exception]<:--[APIException] - [ModelActionType - | - +index: int; - <static>+values: List<ModelActionType>; - <static>+edit: ModelActionType; - <static>+delete: ModelActionType; - <static>+remove: ModelActionType; - <static>+duplicate: ModelActionType; - <static>+clipboard: ModelActionType; - <static>+primary: ModelActionType + [StudyNotFoundException ] - [ModelActionType]o-[ModelActionType] - [Enum]<:--[ModelActionType] + [APIException]<:-[StudyNotFoundException] - [StudyUException - | - +message: String - | - +String toString() + [MeasurementNotFoundException ] - [Exception]<:--[StudyUException] + [APIException]<:-[MeasurementNotFoundException] - [<abstract>ExecutionLimiter - | - +milliseconds: int; - <static>-_timer: Timer? - | - +void dispose() + [QuestionNotFoundException ] - [<abstract>ExecutionLimiter]o-[Timer] + [APIException]<:-[QuestionNotFoundException] - [Debouncer - | - +leading: bool; - +cancelUncompleted: bool; - -_uncompletedFutureOperation: CancelableOperation<dynamic>? - | - +dynamic call() + [ConsentItemNotFoundException ] - [Debouncer]o-[CancelableOperation] - [<abstract>ExecutionLimiter]<:-[Debouncer] + [APIException]<:-[ConsentItemNotFoundException] - [Throttler - | - +dynamic call() + [InterventionNotFoundException ] - [<abstract>ExecutionLimiter]<:-[Throttler] + [APIException]<:-[InterventionNotFoundException] - [<abstract>JsonFileLoader + [InterventionTaskNotFoundException + ] + + [APIException]<:-[InterventionTaskNotFoundException] + + [ReportNotFoundException + ] + + [APIException]<:-[ReportNotFoundException] + + [ReportSectionNotFoundException + ] + + [APIException]<:-[ReportSectionNotFoundException] + + [StudyInviteNotFoundException + ] + + [APIException]<:-[StudyInviteNotFoundException] + + [UserNotFoundException + ] + + [APIException]<:-[UserNotFoundException] + + [StudyUApiClient | - +jsonAssetsPath: String + +supabaseClient: SupabaseClient; + <static>+studyColumns: List<String>; + <static>+studyWithParticipantActivityColumns: List<String>; + +testDelayMilliseconds: int | - +dynamic loadJson(); - +dynamic parseJsonMapFromAssets(); - +dynamic parseJsonListFromAssets() + +dynamic deleteParticipants(); + +dynamic getUserStudies(); + +dynamic fetchStudy(); + +dynamic deleteStudy(); + +dynamic saveStudy(); + +dynamic fetchStudyInvite(); + +dynamic saveStudyInvite(); + +dynamic deleteStudyInvite(); + +dynamic fetchAppConfig(); + +dynamic fetchUser(); + +dynamic saveUser(); + -dynamic _awaitGuarded(); + -dynamic _apiException(); + -dynamic _testDelay() ] - [<abstract>FileFormatEncoder + [StudyUApiClient]o-[SupabaseClient] + [<abstract>SupabaseClientDependant]<:-[StudyUApiClient] + [<abstract>SupabaseQueryMixin]<:-[StudyUApiClient] + [<abstract>StudyUApi]<:--[StudyUApiClient] + + [AppTranslation | - +dynamic encodeAsync(); - +String encode(); - +dynamic call() + <static>+dynamic init() ] - [CSVStringEncoder + [LanguagePicker | - +String encode() + +languagePickerType: LanguagePickerType; + +iconColor: Color?; + +offset: Offset? ] - [<abstract>FileFormatEncoder]<:-[CSVStringEncoder] + [LanguagePicker]o-[LanguagePickerType] + [LanguagePicker]o-[Color] + [LanguagePicker]o-[Offset] - [JsonStringEncoder + [LanguagePickerType | - +String encode() + +index: int; + <static>+values: List<LanguagePickerType>; + <static>+field: LanguagePickerType; + <static>+icon: LanguagePickerType ] - [<abstract>FileFormatEncoder]<:-[JsonStringEncoder] + [LanguagePickerType]o-[LanguagePickerType] + [Enum]<:--[LanguagePickerType] - [OptimisticUpdate - | - +applyOptimistic: void Function(); - +apply: dynamic Function(); - +rollback: void Function(); - +onUpdate: void Function()?; - +onError: void Function(Object, StackTrace?)?; - +rethrowErrors: bool; - +runOptimistically: bool; - +completeFutureOptimistically: bool + [<abstract>PlatformLocale | - +dynamic execute(); - -void _runUpdateHandlerIfAny() + +Locale getPlatformLocale() ] - [OptimisticUpdate]o-[void Function()] - [OptimisticUpdate]o-[dynamic Function()] - [OptimisticUpdate]o-[void Function()?] - [OptimisticUpdate]o-[void Function(Object, StackTrace?)?] - - [Tuple - | - +first: T1; - +second: T2; - +props: List<Object?> + [PlatformLocaleMobile | - +Map<String, dynamic> toJson(); - <static>+Tuple<dynamic, dynamic> fromJson(); - +Tuple<T1, T2> copy(); - +Tuple<T1, T2> copyWith() + +Locale getPlatformLocale() ] - [<abstract>Equatable]<:-[Tuple] + [<abstract>PlatformLocale]<:--[PlatformLocaleMobile] - [SuppressedBehaviorSubject - | - +subject: BehaviorSubject<T>; - +didSuppressInitialEvent: bool; - -_controller: StreamController<T> + [PlatformLocaleWeb | - -StreamController<T> _buildDerivedController(); - +dynamic close() + +Locale getPlatformLocale() ] - [SuppressedBehaviorSubject]o-[BehaviorSubject] - [SuppressedBehaviorSubject]o-[StreamController] + [<abstract>PlatformLocale]<:--[PlatformLocaleWeb] - [NumericalRangeFormatter + [<abstract>GoRouteParamEnum | - +min: int?; - +max: int? + +String toRouteParam(); + +String toShortString() + ] + + [RouterKeys | - +TextEditingValue formatEditUpdate() + <static>+studyKey: ValueKey<String>; + <static>+authKey: ValueKey<String> ] - [<abstract>TextInputFormatter]<:-[NumericalRangeFormatter] + [RouterKeys]o-[ValueKey] - [StudySequenceFormatter + [RouteParams | - +TextEditingValue formatEditUpdate() + <static>+studiesFilter: String; + <static>+studyId: String; + <static>+measurementId: String; + <static>+interventionId: String; + <static>+testAppRoute: String ] - [<abstract>TextInputFormatter]<:-[StudySequenceFormatter] - - [SerializableColor + [RouterConf | - +Map<String, dynamic> toJson(); - <static>+SerializableColor fromJson() + <static>+router: GoRouter; + <static>+routes: List<GoRoute>; + <static>+publicRoutes: List<GoRoute>; + <static>+privateRoutes: List<GoRoute> + | + <static>+GoRoute route() ] - [Color]<:-[SerializableColor] + [RouterConf]o-[GoRouter] - [<abstract>IProviderArgsResolver + [<abstract>StudyFormRouteArgs | - +R provide() + +studyId: String ] - [Config + [<abstract>QuestionFormRouteArgs | - <static>+isDebugMode: bool; - <static>+defaultLocale: Set<String>; - <static>+supportedLocales: Map<String, String>; - <static>+newStudyId: String; - <static>+newModelId: String; - <static>+minSplashTime: int; - <static>+formAutosaveDebounce: int + +questionId: String ] - [<abstract>FormValidationSetEnum + [<abstract>StudyFormRouteArgs]<:-[<abstract>QuestionFormRouteArgs] + + [ScreenerQuestionFormRouteArgs ] - [FormControlValidation + [<abstract>QuestionFormRouteArgs]<:-[ScreenerQuestionFormRouteArgs] + + [ConsentItemFormRouteArgs | - +control: AbstractControl<dynamic>; - +validators: List<Validator<dynamic>>; - +asyncValidators: List<AsyncValidator<dynamic>>?; - +validationMessages: Map<String, String Function(Object)> + +consentId: String + ] + + [<abstract>StudyFormRouteArgs]<:-[ConsentItemFormRouteArgs] + + [MeasurementFormRouteArgs | - +FormControlValidation merge() + +measurementId: String ] - [FormControlValidation]o-[<abstract>AbstractControl] + [<abstract>StudyFormRouteArgs]<:-[MeasurementFormRouteArgs] - [<abstract>ManagedFormViewModel + [SurveyQuestionFormRouteArgs | - +ManagedFormViewModel<T> createDuplicate() + +questionId: String ] - [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] + [MeasurementFormRouteArgs]<:-[SurveyQuestionFormRouteArgs] + [<abstract>QuestionFormRouteArgs]<:--[SurveyQuestionFormRouteArgs] - [FormViewModelNotFoundException + [InterventionFormRouteArgs + | + +interventionId: String ] - [Exception]<:--[FormViewModelNotFoundException] + [<abstract>StudyFormRouteArgs]<:-[InterventionFormRouteArgs] - [FormViewModelCollection + [InterventionTaskFormRouteArgs | - +formViewModels: List<T>; - +formArray: FormArray<dynamic>; - +stagedViewModels: List<T>; - +retrievableViewModels: List<T>; - +formData: List<D> + +taskId: String + ] + + [InterventionFormRouteArgs]<:-[InterventionTaskFormRouteArgs] + + [ReportItemFormRouteArgs | - +void add(); - +T remove(); - +T? findWhere(); - +T? removeWhere(); - +bool contains(); - +void stage(); - +T commit(); - +void reset(); - +void read() + +sectionId: String ] - [FormViewModelCollection]o-[FormArray] + [<abstract>StudyFormRouteArgs]<:-[ReportItemFormRouteArgs] - [FormArrayTable + [RoutingIntents | - +control: AbstractControl<dynamic>; - +items: List<T>; - +onSelectItem: void Function(T); - +getActionsAt: List<ModelAction<dynamic>> Function(T, int); - +onNewItem: void Function()?; - +rowTitle: String Function(T); - +onNewItemLabel: String; - +sectionTitle: String?; - +sectionDescription: String?; - +emptyIcon: IconData?; - +emptyTitle: String?; - +emptyDescription: String?; - +sectionTitleDivider: bool?; - +rowPrefix: Widget Function(BuildContext, T, int)?; - +rowSuffix: Widget Function(BuildContext, T, int)?; - +leadingWidget: Widget?; - +itemsSectionPadding: EdgeInsets?; - +hideLeadingTrailingWhenEmpty: bool; - <static>+columns: List<StandardTableColumn> - | - +Widget build(); - -List<Widget> _buildRow(); - -Widget _newItemButton() + <static>+root: RoutingIntent; + <static>+studies: RoutingIntent; + <static>+studiesShared: RoutingIntent; + <static>+publicRegistry: RoutingIntent; + <static>+study: RoutingIntent Function(String); + <static>+studyEdit: RoutingIntent Function(String); + <static>+studyEditInfo: RoutingIntent Function(String); + <static>+studyEditEnrollment: RoutingIntent Function(String); + <static>+studyEditInterventions: RoutingIntent Function(String); + <static>+studyEditIntervention: RoutingIntent Function(String, String); + <static>+studyEditMeasurements: RoutingIntent Function(String); + <static>+studyEditReports: RoutingIntent Function(String); + <static>+studyEditMeasurement: RoutingIntent Function(String, String); + <static>+studyTest: RoutingIntent Function(String, {String? appRoute}); + <static>+studyRecruit: RoutingIntent Function(String); + <static>+studyMonitor: RoutingIntent Function(String); + <static>+studyAnalyze: RoutingIntent Function(String); + <static>+studySettings: RoutingIntent Function(String); + <static>+accountSettings: RoutingIntent; + <static>+studyNew: RoutingIntent; + <static>+login: RoutingIntent; + <static>+signup: RoutingIntent; + <static>+passwordForgot: RoutingIntent; + <static>+passwordForgot2: RoutingIntent Function(String); + <static>+passwordRecovery: RoutingIntent; + <static>+error: RoutingIntent Function(Exception) ] - [FormArrayTable]o-[<abstract>AbstractControl] - [FormArrayTable]o-[void Function(T)] - [FormArrayTable]o-[List<ModelAction<dynamic>> Function(T, int)] - [FormArrayTable]o-[void Function()?] - [FormArrayTable]o-[String Function(T)] - [FormArrayTable]o-[IconData] - [FormArrayTable]o-[Widget Function(BuildContext, T, int)?] - [FormArrayTable]o-[<abstract>Widget] - [FormArrayTable]o-[EdgeInsets] + [RoutingIntents]o-[RoutingIntent] + [RoutingIntents]o-[RoutingIntent Function(String)] + [RoutingIntents]o-[RoutingIntent Function(String, String)] + [RoutingIntents]o-[RoutingIntent Function(String, {String? appRoute})] + [RoutingIntents]o-[RoutingIntent Function(Exception)] - [<abstract>IFormData + [RoutingIntent | - +id: String + +route: GoRoute; + +params: Map<String, String>; + +queryParams: Map<String, String>; + +dispatch: RoutingIntentDispatch?; + +extra: Object?; + +routeName: String; + +arguments: Map<String, String>; + +props: List<Object?> | - +IFormData copy() + -dynamic _validateRoute(); + +bool matches() ] - [CustomFormControl - | - -_onValueChangedDebouncer: Debouncer?; - -_onStatusChangedDebouncer: Debouncer?; - +onValueChanged: void Function(T?)?; - +onStatusChanged: void Function(ControlStatus)?; - +onStatusChangedDebounceTime: int?; - +onValueChangedDebounceTime: int? + [RoutingIntent]o-[GoRoute] + [RoutingIntent]o-[RoutingIntentDispatch] + [<abstract>Equatable]<:-[RoutingIntent] + + [RoutingIntentDispatch | - +void dispose() + +index: int; + <static>+values: List<RoutingIntentDispatch>; + <static>+go: RoutingIntentDispatch; + <static>+push: RoutingIntentDispatch ] - [CustomFormControl]o-[Debouncer] - [CustomFormControl]o-[void Function(T?)?] - [CustomFormControl]o-[void Function(ControlStatus)?] - [FormControl]<:-[CustomFormControl] + [RoutingIntentDispatch]o-[RoutingIntentDispatch] + [Enum]<:--[RoutingIntentDispatch] - [FormInvalidException + [StudyTemplates + | + <static>+kUnnamedStudyTitle: String + | + <static>+Study emptyDraft() ] - [Exception]<:--[FormInvalidException] - - [FormConfigException + [StudyActionType | - +message: String? + +index: int; + <static>+values: List<StudyActionType>; + <static>+pin: StudyActionType; + <static>+pinoff: StudyActionType; + <static>+edit: StudyActionType; + <static>+duplicate: StudyActionType; + <static>+duplicateDraft: StudyActionType; + <static>+addCollaborator: StudyActionType; + <static>+export: StudyActionType; + <static>+delete: StudyActionType ] - [Exception]<:--[FormConfigException] + [StudyActionType]o-[StudyActionType] + [Enum]<:--[StudyActionType] - [<abstract>IFormViewModelDelegate - | - +dynamic onSave(); - +void onCancel() + [<abstract>ResultTypes ] - [<abstract>IFormGroupController + [MeasurementResultTypes | - +form: FormGroup + <static>+questionnaire: String; + <static>+values: List<String> ] - [<abstract>IFormGroupController]o-[FormGroup] + [<abstract>ResultTypes]<:-[MeasurementResultTypes] - [FormControlOption + [InterventionResultTypes | - +value: T; - +label: String; - +description: String?; - +props: List<Object?> + <static>+checkmarkTask: String; + <static>+values: List<String> ] - [<abstract>Equatable]<:-[FormControlOption] + [<abstract>ResultTypes]<:-[InterventionResultTypes] - [<abstract>FormViewModel - | - -_formData: T?; - -_formMode: FormMode; - -_validationSet: FormValidationSetEnum?; - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>?; - +autosave: bool; - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>>; - -_immediateFormChildrenListenerDebouncer: Debouncer?; - -_autosaveOperation: CancelableOperation<dynamic>?; - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>>; - +prevFormValue: Map<String, dynamic>?; - <static>-_formKey: String; - +formData: T?; - +formMode: FormMode; - +isReadonly: bool; - +validationSet: FormValidationSetEnum?; - +isDirty: bool; - +title: String; - +isValid: bool; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + [StudyExportData | - -dynamic _setFormData(); - -dynamic _rememberDefaultControlValidators(); - -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators(); - -dynamic _disableAllControls(); - -dynamic _formModeUpdated(); - -dynamic _restoreControlsFromFormData(); - +void revalidate(); - -void _applyValidationSet(); - +void read(); - +dynamic save(); - +dynamic cancel(); - +void enableAutosave(); - +void listenToImmediateFormChildren(); - +dynamic markFormGroupChanged(); - +void dispose(); - +void setControlsFrom(); - +T buildFormData(); - +void initControls() + +study: Study; + +measurementsData: List<Map<String, dynamic>>; + +interventionsData: List<Map<String, dynamic>>; + +isEmpty: bool ] - [<abstract>FormViewModel]o-[FormMode] - [<abstract>FormViewModel]o-[<abstract>FormValidationSetEnum] - [<abstract>FormViewModel]o-[<abstract>IFormViewModelDelegate] - [<abstract>FormViewModel]o-[Debouncer] - [<abstract>FormViewModel]o-[CancelableOperation] - [<abstract>IFormGroupController]<:--[<abstract>FormViewModel] + [StudyExportData]o-[Study] - [FormMode + [FormSideSheetTab | - +index: int; - <static>+values: List<FormMode>; - <static>+create: FormMode; - <static>+readonly: FormMode; - <static>+edit: FormMode + +formViewBuilder: Widget Function(T) ] - [FormMode]o-[FormMode] - [Enum]<:--[FormMode] - - [UnsavedChangesDialog - | - +Widget build() - ] + [FormSideSheetTab]o-[Widget Function(T)] + [NavbarTab]<:-[FormSideSheetTab] - [DrawerEntry - | - +localizedTitle: String Function(); - +icon: IconData?; - +localizedHelpText: String Function()?; - +enabled: bool; - +onSelected: void Function(BuildContext, WidgetRef)?; - +title: String; - +helpText: String? + [SidesheetTab | - +void onClick() + +builder: Widget Function(BuildContext) ] - [DrawerEntry]o-[String Function()] - [DrawerEntry]o-[IconData] - [DrawerEntry]o-[String Function()?] - [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] + [SidesheetTab]o-[Widget Function(BuildContext)] + [NavbarTab]<:-[SidesheetTab] - [GoRouterDrawerEntry - | - +intent: RoutingIntent + [Sidesheet | - +void onClick() + <static>+kDefaultWidth: double; + +titleText: String; + +body: Widget?; + +tabs: List<SidesheetTab>?; + +actionButtons: List<Widget>?; + +width: double?; + +withCloseButton: bool; + +ignoreAppBar: bool; + +collapseSingleTab: bool; + +bodyPadding: EdgeInsets?; + +wrapContent: Widget Function(Widget)? ] - [GoRouterDrawerEntry]o-[RoutingIntent] - [DrawerEntry]<:-[GoRouterDrawerEntry] + [Sidesheet]o-[<abstract>Widget] + [Sidesheet]o-[EdgeInsets] + [Sidesheet]o-[Widget Function(Widget)?] - [AppDrawer + [MouseEventsRegion | - +title: String; - +width: int; - +leftPaddingEntries: double; - +logoPaddingVertical: double; - +logoPaddingHorizontal: double; - +logoMaxHeight: double; - +logoSectionMinHeight: double; - +logoSectionMaxHeight: double + +onTap: void Function()?; + +onHover: void Function(PointerHoverEvent)?; + +onEnter: void Function(PointerEnterEvent)?; + +onExit: void Function(PointerExitEvent)?; + +autoselectCursor: bool; + +cursor: SystemMouseCursor; + <static>+defaultCursor: SystemMouseCursor; + +autoCursor: SystemMouseCursor ] - [AuthScaffold - | - +body: Widget; - +formKey: AuthFormKey; - +leftContentMinWidth: double; - +leftPanelMinWidth: double; - +leftPanelPadding: EdgeInsets + [MouseEventsRegion]o-[void Function()?] + [MouseEventsRegion]o-[void Function(PointerHoverEvent)?] + [MouseEventsRegion]o-[void Function(PointerEnterEvent)?] + [MouseEventsRegion]o-[void Function(PointerExitEvent)?] + [MouseEventsRegion]o-[SystemMouseCursor] + + [ReactiveCustomColorPicker ] - [AuthScaffold]o-[<abstract>Widget] - [AuthScaffold]o-[AuthFormKey] - [AuthScaffold]o-[EdgeInsets] + [ReactiveFormField]<:-[ReactiveCustomColorPicker] - [PasswordRecoveryForm - | - +formKey: AuthFormKey + [SplashPage | +Widget build() ] - [PasswordRecoveryForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] - - [LoginForm + [ErrorPage | - +formKey: AuthFormKey + +error: Exception? | +Widget build() ] - [LoginForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[LoginForm] + [<abstract>ConsumerWidget]<:-[ErrorPage] - [SignupForm + [AsyncValueWidget | - +formKey: AuthFormKey + +value: AsyncValue<T>; + +data: Widget Function(T); + +error: Widget Function(Object, StackTrace?)?; + +loading: Widget Function()?; + +empty: Widget Function()? | +Widget build(); - -dynamic _onClickTermsOfUse(); - -dynamic _onClickPrivacyPolicy() + -Widget _buildDataOrEmptyWidget(); + -Widget _defaultError(); + -Widget _defaultLoad() ] - [SignupForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[SignupForm] + [AsyncValueWidget]o-[<abstract>AsyncValue] + [AsyncValueWidget]o-[Widget Function(T)] + [AsyncValueWidget]o-[Widget Function(Object, StackTrace?)?] + [AsyncValueWidget]o-[Widget Function()?] - [PasswordForgotForm - | - +formKey: AuthFormKey + [Search | - +Widget build() + +onQueryChanged: dynamic Function(String); + +searchController: SearchController?; + +hintText: String?; + +initialText: String? ] - [PasswordForgotForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] + [Search]o-[dynamic Function(String)] + [Search]o-[SearchController] - [StudyUJobsToBeDone + [SearchController | - +Widget build() + +setText: void Function(String) ] - [AuthFormController + [SearchController]o-[void Function(String)] + + [HtmlStylingBanner | - +authRepository: IAuthRepository; - +sharedPreferences: SharedPreferences; - +notificationService: INotificationService; - +router: GoRouter; - +emailControl: FormControl<String>; - +passwordControl: FormControl<String>; - +passwordConfirmationControl: FormControl<String>; - +rememberMeControl: FormControl<bool>; - +termsOfServiceControl: FormControl<bool>; - <static>+authValidationMessages: Map<String, String Function(dynamic)>; - +loginForm: FormGroup; - +signupForm: FormGroup; - +passwordForgotForm: FormGroup; - +passwordRecoveryForm: FormGroup; - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>>; - -_formKey: AuthFormKey; - +shouldRemember: bool; - +formKey: AuthFormKey; - +form: FormGroup + +isDismissed: bool; + +onDismissed: dynamic Function()? | - -dynamic _onChangeFormKey(); - +dynamic resetControlsFor(); - -dynamic _forceValidationMessages(); - +dynamic signUp(); - -dynamic _signUp(); - +dynamic signIn(); - -dynamic _signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic sendPasswordResetLink(); - +dynamic recoverPassword(); - +dynamic updateUser(); - -void _setRememberMe(); - -void _delRememberMe(); - -void _initRememberMe() + +Widget build() ] - [AuthFormController]o-[<abstract>IAuthRepository] - [AuthFormController]o-[SharedPreferences] - [AuthFormController]o-[<abstract>INotificationService] - [AuthFormController]o-[GoRouter] - [AuthFormController]o-[FormControl] - [AuthFormController]o-[FormGroup] - [AuthFormController]o-[AuthFormKey] - [<abstract>IFormGroupController]<:--[AuthFormController] + [HtmlStylingBanner]o-[dynamic Function()?] - [AuthFormKey - | - +index: int; - <static>+values: List<AuthFormKey>; - <static>+login: AuthFormKey; - <static>+signup: AuthFormKey; - <static>+passwordForgot: AuthFormKey; - <static>+passwordRecovery: AuthFormKey; - <static>-_loginSubmit: AuthFormKey; - <static>-_signupSubmit: AuthFormKey + [NullHelperDecoration ] - [AuthFormKey]o-[AuthFormKey] - [Enum]<:--[AuthFormKey] + [InputDecoration]<:-[NullHelperDecoration] - [EmailTextField + [<abstract>IWithBanner | - +labelText: String; - +hintText: String?; - +formControlName: String?; - +formControl: FormControl<dynamic>? + +Widget? banner() ] - [EmailTextField]o-[FormControl] - - [PasswordTextField + [BannerBox | - +labelText: String; - +hintText: String?; - +formControlName: String?; - +formControl: FormControl<dynamic>? + +prefixIcon: Widget?; + +body: Widget; + +style: BannerStyle; + +padding: EdgeInsets?; + +noPrefix: bool; + +dismissable: bool; + +isDismissed: bool?; + +onDismissed: dynamic Function()?; + +dismissIconSize: double ] - [PasswordTextField]o-[FormControl] + [BannerBox]o-[<abstract>Widget] + [BannerBox]o-[BannerStyle] + [BannerBox]o-[EdgeInsets] + [BannerBox]o-[dynamic Function()?] - [<abstract>IAppDelegate + [BannerStyle | - +dynamic onAppStart() + +index: int; + <static>+values: List<BannerStyle>; + <static>+warning: BannerStyle; + <static>+info: BannerStyle; + <static>+error: BannerStyle ] - [AppController + [BannerStyle]o-[BannerStyle] + [Enum]<:--[BannerStyle] + + [ConstrainedWidthFlexible | - +sharedPreferences: SharedPreferences; - +appDelegates: List<IAppDelegate>; - -_delayedFuture: dynamic; - +isInitialized: dynamic + +minWidth: double; + +maxWidth: double; + +flex: int; + +flexSum: int; + +child: Widget; + +outerConstraints: BoxConstraints | - +dynamic onAppStart(); - -dynamic _callDelegates() + +Widget build(); + -double _getWidth() ] - [AppController]o-[SharedPreferences] + [ConstrainedWidthFlexible]o-[<abstract>Widget] + [ConstrainedWidthFlexible]o-[BoxConstraints] - [InviteCodeFormView + [ActionPopUpMenuButton | - +formViewModel: InviteCodeFormViewModel + +actions: List<ModelAction<dynamic>>; + +triggerIconColor: Color?; + +triggerIconColorHover: Color?; + +triggerIconSize: double; + +disableSplashEffect: bool; + +hideOnEmpty: bool; + +orientation: Axis; + +elevation: double?; + +splashRadius: double?; + +enabled: bool; + +position: PopupMenuPosition | +Widget build(); - -List<FormTableRow> _conditionalInterventionRows() + -Widget _buildPopupMenu() ] - [InviteCodeFormView]o-[InviteCodeFormViewModel] - [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] + [ActionPopUpMenuButton]o-[Color] + [ActionPopUpMenuButton]o-[Axis] + [ActionPopUpMenuButton]o-[PopupMenuPosition] - [StudyRecruitScreen + [FormControlLabel | - +Widget build(); - -Widget _inviteCodesSectionHeader(); - -Widget _newInviteCodeButton(); - -dynamic _onSelectInvite() + +formControl: AbstractControl<dynamic>; + +text: String; + +isClickable: bool; + +textStyle: TextStyle?; + +onClick: void Function(AbstractControl<dynamic>)? + | + +Widget build() ] - [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] + [FormControlLabel]o-[<abstract>AbstractControl] + [FormControlLabel]o-[TextStyle] + [FormControlLabel]o-[void Function(AbstractControl<dynamic>)?] - [StudyRecruitController + [EmptyBody | - +inviteCodeRepository: IInviteCodeRepository; - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + +icon: IconData?; + +leading: Widget?; + +leadingSpacing: double?; + +title: String?; + +description: String?; + +button: Widget? | - -dynamic _subscribeInvites(); - +Intervention? getIntervention(); - +int getParticipantCountForInvite(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void dispose() + +Widget build() ] - [StudyRecruitController]o-[<abstract>IInviteCodeRepository] - [StudyRecruitController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyRecruitController] - [<abstract>IModelActionProvider]<:--[StudyRecruitController] - - [InviteCodeFormViewModel - | - +study: Study; - +inviteCodeRepository: IInviteCodeRepository; - +codeControl: FormControl<String>; - +codeControlValidationMessages: Map<String, String Function(dynamic)>; - +isPreconfiguredScheduleControl: FormControl<bool>; - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence>; - +interventionAControl: FormControl<String>; - +interventionBControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +interventionControlOptions: List<FormControlOption<String>>; - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; - +isPreconfiguredSchedule: bool; - +preconfiguredSchedule: List<String>? + [EmptyBody]o-[IconData] + [EmptyBody]o-[<abstract>Widget] + + [ActionMenuType | - +void initControls(); - -dynamic _uniqueInviteCode(); - +void regenerateCode(); - -String _generateCode(); - +StudyInvite buildFormData(); - +void setControlsFrom(); - +dynamic save() + +index: int; + <static>+values: List<ActionMenuType>; + <static>+inline: ActionMenuType; + <static>+popup: ActionMenuType ] - [InviteCodeFormViewModel]o-[Study] - [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] - [InviteCodeFormViewModel]o-[FormControl] - [InviteCodeFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] + [ActionMenuType]o-[ActionMenuType] + [Enum]<:--[ActionMenuType] - [EnrolledBadge + [HelpIcon | - +enrolledCount: int + +tooltipText: String? | +Widget build() ] - [StudyInvitesTable + [StudyULogo | - +invites: List<StudyInvite>; - +onSelect: void Function(StudyInvite); - +getActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getIntervention: Intervention? Function(String); - +getParticipantCountForInvite: int Function(StudyInvite) + +onTap: void Function()? | - +Widget build(); - -List<Widget> _buildRow() + +Widget build() ] - [StudyInvitesTable]o-[void Function(StudyInvite)] - [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] - [StudyInvitesTable]o-[Intervention? Function(String)] - [StudyInvitesTable]o-[int Function(StudyInvite)] + [StudyULogo]o-[void Function()?] - [StudyFormViewModel + [SingleColumnLayout | - +studyDirtyCopy: Study?; - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +router: GoRouter; - +studyInfoFormViewModel: StudyInfoFormViewModel; - +enrollmentFormViewModel: EnrollmentFormViewModel; - +measurementsFormViewModel: MeasurementsFormViewModel; - +reportsFormViewModel: ReportsFormViewModel; - +interventionsFormViewModel: InterventionsFormViewModel; - +form: FormGroup; - +isStudyReadonly: bool; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String> + <static>+defaultConstraints: BoxConstraints; + <static>+defaultConstraintsNarrow: BoxConstraints; + +body: Widget; + +header: Widget?; + +stickyHeader: bool; + +constraints: BoxConstraints?; + +scroll: bool; + +padding: EdgeInsets? | - +void read(); - +void setControlsFrom(); - +Study buildFormData(); - +void dispose(); - +void onCancel(); - +dynamic onSave(); - -dynamic _applyAndSaveSubform() + <static>+dynamic fromType() ] - [StudyFormViewModel]o-[Study] - [StudyFormViewModel]o-[<abstract>IStudyRepository] - [StudyFormViewModel]o-[<abstract>IAuthRepository] - [StudyFormViewModel]o-[GoRouter] - [StudyFormViewModel]o-[StudyInfoFormViewModel] - [StudyFormViewModel]o-[EnrollmentFormViewModel] - [StudyFormViewModel]o-[MeasurementsFormViewModel] - [StudyFormViewModel]o-[ReportsFormViewModel] - [StudyFormViewModel]o-[InterventionsFormViewModel] - [StudyFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] + [SingleColumnLayout]o-[BoxConstraints] + [SingleColumnLayout]o-[<abstract>Widget] + [SingleColumnLayout]o-[EdgeInsets] - [ConsentItemFormView + [SingleColumnLayoutType | - +formViewModel: ConsentItemFormViewModel + +index: int; + <static>+values: List<SingleColumnLayoutType>; + <static>+boundedWide: SingleColumnLayoutType; + <static>+boundedNarrow: SingleColumnLayoutType; + <static>+stretched: SingleColumnLayoutType; + <static>+split: SingleColumnLayoutType ] - [ConsentItemFormView]o-[ConsentItemFormViewModel] + [SingleColumnLayoutType]o-[SingleColumnLayoutType] + [Enum]<:--[SingleColumnLayoutType] - [EnrollmentFormData - | - <static>+kDefaultEnrollmentType: Participation; - +enrollmentType: Participation; - +questionnaireFormData: QuestionnaireFormData; - +consentItemsFormData: List<ConsentItemFormData>?; - +id: String + [<abstract>ISyncIndicatorViewModel | - +Study apply(); - +EnrollmentFormData copy() + +isDirty: bool; + +lastSynced: DateTime? ] - [EnrollmentFormData]o-[Participation] - [EnrollmentFormData]o-[QuestionnaireFormData] - [<abstract>IStudyFormData]<:--[EnrollmentFormData] - - [StudyDesignEnrollmentFormView + [SyncIndicator | - +Widget build(); - -dynamic _showScreenerQuestionSidesheetWithArgs(); - -dynamic _showConsentItemSidesheetWithArgs() + +state: AsyncValue<T>; + +lastSynced: DateTime?; + +isDirty: bool; + +animationDuration: int; + +iconSize: double ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] + [SyncIndicator]o-[<abstract>AsyncValue] - [ConsentItemFormViewModel + [TextParagraph | - +consentIdControl: FormControl<String>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +form: FormGroup; - +consentId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +titles: Map<FormMode, String> + +text: String?; + +style: TextStyle?; + +selectable: bool; + +span: List<TextSpan>? | - +void setControlsFrom(); - +ConsentItemFormData buildFormData(); - +ConsentItemFormViewModel createDuplicate() + +Widget build() ] - [ConsentItemFormViewModel]o-[FormControl] - [ConsentItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] + [TextParagraph]o-[TextStyle] - [<abstract>IScreenerQuestionLogicFormViewModel + [DismissButton | - +isDirtyOptionsBannerVisible: bool + +onPressed: void Function()?; + +text: String? + | + +Widget build() ] - [ScreenerQuestionLogicFormView + [DismissButton]o-[void Function()?] + + [Badge | - +formViewModel: ScreenerQuestionFormViewModel + +icon: IconData?; + +color: Color?; + +borderRadius: double; + +label: String; + +type: BadgeType; + +padding: EdgeInsets; + +iconSize: double?; + +labelStyle: TextStyle? | +Widget build(); - -dynamic _buildInfoBanner(); - -dynamic _buildAnswerOptionsLogicControls(); - -List<Widget> _buildOptionLogicRow() + -Color? _getBackgroundColor(); + -Color _getBorderColor(); + -Color? _getLabelColor() ] - [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] - [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] + [Badge]o-[IconData] + [Badge]o-[Color] + [Badge]o-[BadgeType] + [Badge]o-[EdgeInsets] + [Badge]o-[TextStyle] - [ScreenerQuestionFormViewModel + [BadgeType | - <static>+defaultResponseOptionValidity: bool; - +responseOptionsDisabledArray: FormArray<dynamic>; - +responseOptionsLogicControls: FormArray<bool>; - +responseOptionsLogicDescriptionControls: FormArray<String>; - -_questionBaseControls: Map<String, AbstractControl<dynamic>>; - +prevResponseOptionControls: List<AbstractControl<dynamic>>; - +prevResponseOptionValues: List<dynamic>; - +responseOptionsDisabledControls: List<AbstractControl<dynamic>>; - +logicControlOptions: List<FormControlOption<bool>>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isDirtyOptionsBannerVisible: bool + +index: int; + <static>+values: List<BadgeType>; + <static>+filled: BadgeType; + <static>+outlined: BadgeType; + <static>+outlineFill: BadgeType; + <static>+plain: BadgeType + ] + + [BadgeType]o-[BadgeType] + [Enum]<:--[BadgeType] + + [Hyperlink | - +dynamic onResponseOptionsChanged(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - -List<FormControl<dynamic>> _copyFormControls(); - -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); - -AbstractControl<dynamic>? _findAssociatedControlFor(); - +ScreenerQuestionFormViewModel createDuplicate() + +text: String; + +url: String?; + +onClick: void Function()?; + +linkColor: Color; + +hoverColor: Color?; + +visitedColor: Color?; + +style: TextStyle?; + +hoverStyle: TextStyle?; + +visitedStyle: TextStyle?; + +icon: IconData?; + +iconSize: double? ] - [ScreenerQuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] - [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] + [Hyperlink]o-[void Function()?] + [Hyperlink]o-[Color] + [Hyperlink]o-[TextStyle] + [Hyperlink]o-[IconData] - [EnrollmentFormViewModel + [FormScaffold | - +study: Study; - +router: GoRouter; - +consentItemDelegate: EnrollmentFormConsentItemDelegate; - +enrollmentTypeControl: FormControl<Participation>; - +consentItemArray: FormArray<dynamic>; - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +form: FormGroup; - +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; - +consentItemModels: List<ConsentItemFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestScreener: bool; - +canTestConsent: bool; - +questionTitles: Map<FormMode, String Function()> - | - +void setControlsFrom(); - +EnrollmentFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); - +dynamic testScreener(); - +dynamic testConsent(); - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + +formViewModel: T; + +actions: List<Widget>?; + +body: Widget; + +drawer: Widget?; + +actionsSpacing: double; + +actionsPadding: double ] - [EnrollmentFormViewModel]o-[Study] - [EnrollmentFormViewModel]o-[GoRouter] - [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] - [EnrollmentFormViewModel]o-[FormControl] - [EnrollmentFormViewModel]o-[FormArray] - [EnrollmentFormViewModel]o-[FormViewModelCollection] - [EnrollmentFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] - [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] + [FormScaffold]o-[<abstract>Widget] - [EnrollmentFormConsentItemDelegate - | - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +owner: EnrollmentFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic + [PrimaryButton | - +void onCancel(); - +dynamic onSave(); - +ConsentItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + +text: String; + +icon: IconData?; + +isLoading: bool; + +showLoadingEarliestAfterMs: int; + +onPressed: void Function()?; + +tooltip: String; + +tooltipDisabled: String; + +enabled: bool; + +onPressedFuture: dynamic Function()?; + +innerPadding: EdgeInsets; + +minimumSize: Size?; + +isDisabled: bool ] - [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] - [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] + [PrimaryButton]o-[IconData] + [PrimaryButton]o-[void Function()?] + [PrimaryButton]o-[dynamic Function()?] + [PrimaryButton]o-[EdgeInsets] + [PrimaryButton]o-[Size] - [ConsentItemFormData - | - +consentId: String; - +title: String; - +description: String; - +iconName: String?; - +id: String + [UnderConstruction | - +ConsentItem toConsentItem(); - +ConsentItemFormData copy() + +Widget build() ] - [<abstract>IFormData]<:-[ConsentItemFormData] - - [InterventionsFormData + [ActionMenuInline | - +interventionsData: List<InterventionFormData>; - +studyScheduleData: StudyScheduleFormData; - +id: String + +actions: List<ModelAction<dynamic>>; + +iconSize: double?; + +visible: bool; + +splashRadius: double?; + +paddingVertical: double?; + +paddingHorizontal: double? | - +Study apply(); - +InterventionsFormData copy() + +Widget build() ] - [InterventionsFormData]o-[StudyScheduleFormData] - [<abstract>IStudyFormData]<:--[InterventionsFormData] - - [InterventionTaskFormViewModel + [IconPack | - +taskIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +taskTitleControl: FormControl<String>; - +taskDescriptionControl: FormControl<String>; - +markAsCompletedControl: FormControl<bool>; - +form: FormGroup; - +taskId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +titles: Map<FormMode, String> + <static>+defaultPack: List<IconOption>; + <static>+material: List<IconOption> | - +void setControlsFrom(); - +InterventionTaskFormData buildFormData(); - +InterventionTaskFormViewModel createDuplicate() + <static>+IconOption? resolveIconByName() ] - [InterventionTaskFormViewModel]o-[FormControl] - [InterventionTaskFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] - [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] - - [InterventionTaskFormView + [IconOption | - +formViewModel: InterventionTaskFormViewModel + +name: String; + +icon: IconData?; + +isEmpty: bool; + +props: List<Object?> + | + +String toJson(); + <static>+IconOption fromJson() ] - [InterventionTaskFormView]o-[InterventionTaskFormViewModel] + [IconOption]o-[IconData] + [<abstract>Equatable]<:-[IconOption] - [StudyScheduleFormData - | - +sequenceType: PhaseSequence; - +sequenceTypeCustom: String; - +numCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +id: String - | - +StudySchedule toStudySchedule(); - +Study apply(); - +StudyScheduleFormData copy() + [ReactiveIconPicker ] - [StudyScheduleFormData]o-[PhaseSequence] - [<abstract>IStudyFormData]<:--[StudyScheduleFormData] + [ReactiveFocusableFormField]<:-[ReactiveIconPicker] - [InterventionFormView + [IconPicker | - +formViewModel: InterventionFormViewModel + +iconOptions: List<IconOption>; + +selectedOption: IconOption?; + +onSelect: void Function(IconOption)?; + +galleryIconSize: double?; + +selectedIconSize: double?; + +focusNode: FocusNode?; + +isDisabled: bool + | + +Widget build() ] - [InterventionFormView]o-[InterventionFormViewModel] + [IconPicker]o-[IconOption] + [IconPicker]o-[void Function(IconOption)?] + [IconPicker]o-[FocusNode] - [InterventionsFormViewModel + [IconPickerField | - +study: Study; - +router: GoRouter; - +interventionsArray: FormArray<dynamic>; - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; - +form: FormGroup; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +interventionsRequired: dynamic; - +titles: Map<FormMode, String>; - +canTestStudySchedule: bool + +iconOptions: List<IconOption>; + +selectedOption: IconOption?; + +selectedIconSize: double?; + +galleryIconSize: double?; + +onSelect: void Function(IconOption)?; + +focusNode: FocusNode?; + +isDisabled: bool | - +void setControlsFrom(); - +InterventionsFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +InterventionFormViewModel provide(); - +void onCancel(); - +dynamic onSave(); - +dynamic testStudySchedule() + +Widget build() ] - [InterventionsFormViewModel]o-[Study] - [InterventionsFormViewModel]o-[GoRouter] - [InterventionsFormViewModel]o-[FormArray] - [InterventionsFormViewModel]o-[FormViewModelCollection] - [InterventionsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InterventionsFormViewModel] - [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] + [IconPickerField]o-[IconOption] + [IconPickerField]o-[void Function(IconOption)?] + [IconPickerField]o-[FocusNode] - [InterventionFormData + [IconPickerGallery | - +interventionId: String; - +title: String; - +description: String?; - +tasksData: List<InterventionTaskFormData>?; - +iconName: String?; - <static>+kDefaultTitle: String; - +id: String + +iconOptions: List<IconOption>; + +onSelect: void Function(IconOption)?; + +iconSize: double | - +Intervention toIntervention(); - +InterventionFormData copy() + +Widget build() ] - [<abstract>IFormData]<:-[InterventionFormData] + [IconPickerGallery]o-[void Function(IconOption)?] - [StudyScheduleFormView - | - +formViewModel: StudyScheduleControls + [<abstract>FormConsumerWidget | - -FormTableRow _renderCustomSequence(); +Widget build() ] - [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] - [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] + [<abstract>FormConsumerRefWidget + | + +Widget build() + ] - [InterventionFormViewModel + [Collapsible | - +study: Study; - +interventionIdControl: FormControl<String>; - +interventionTitleControl: FormControl<String>; - +interventionIconControl: FormControl<IconOption>; - +interventionDescriptionControl: FormControl<String>; - +interventionTasksArray: FormArray<dynamic>; - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; - +form: FormGroup; - +interventionId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneTask: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +InterventionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +void onCancel(); - +dynamic onSave(); - +InterventionTaskFormViewModel provide(); - +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); - +InterventionTaskFormRouteArgs buildFormRouteArgs(); - +InterventionFormViewModel createDuplicate() + +contentBuilder: Widget Function(BuildContext, bool); + +headerBuilder: Widget Function(BuildContext, bool)?; + +title: String?; + +isCollapsed: bool ] - [InterventionFormViewModel]o-[Study] - [InterventionFormViewModel]o-[FormControl] - [InterventionFormViewModel]o-[FormArray] - [InterventionFormViewModel]o-[FormViewModelCollection] - [InterventionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] + [Collapsible]o-[Widget Function(BuildContext, bool)] + [Collapsible]o-[Widget Function(BuildContext, bool)?] - [<abstract>StudyScheduleControls + [StandardDialog | - <static>+defaultScheduleType: PhaseSequence; - <static>+defaultScheduleTypeSequence: String; - <static>+defaultNumCycles: int; - <static>+defaultPeriodLength: int; - +sequenceTypeControl: FormControl<PhaseSequence>; - +sequenceTypeCustomControl: FormControl<String>; - +phaseDurationControl: FormControl<int>; - +numCyclesControl: FormControl<int>; - +includeBaselineControl: FormControl<bool>; - +studyScheduleControls: Map<String, FormControl<Object>>; - <static>+kNumCyclesMin: int; - <static>+kNumCyclesMax: int; - <static>+kPhaseDurationMin: int; - <static>+kPhaseDurationMax: int; - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +numCyclesRange: dynamic; - +phaseDurationRange: dynamic; - +customSequenceRequired: dynamic + +title: Widget?; + +titleText: String?; + +body: Widget; + +actionButtons: List<Widget>; + +backgroundColor: Color?; + +borderRadius: double?; + +width: double?; + +height: double?; + +minWidth: double; + +minHeight: double; + +maxWidth: double?; + +maxHeight: double?; + +padding: EdgeInsets | - +void setStudyScheduleControlsFrom(); - +StudyScheduleFormData buildStudyScheduleFormData(); - +bool isSequencingCustom() + +Widget build() ] - [<abstract>StudyScheduleControls]o-[PhaseSequence] - [<abstract>StudyScheduleControls]o-[FormControl] + [StandardDialog]o-[<abstract>Widget] + [StandardDialog]o-[Color] + [StandardDialog]o-[EdgeInsets] - [StudyDesignInterventionsFormView + [SecondaryButton + | + +text: String; + +icon: IconData?; + +isLoading: bool; + +onPressed: void Function()? | +Widget build() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] + [SecondaryButton]o-[IconData] + [SecondaryButton]o-[void Function()?] - [InterventionTaskFormData - | - +taskId: String; - +taskTitle: String; - +taskDescription: String?; - <static>+kDefaultTitle: String; - +id: String + [StandardTableColumn | - +CheckmarkTask toTask(); - +InterventionTaskFormData copy() + +label: String; + +tooltip: String?; + +columnWidth: TableColumnWidth; + +sortable: bool; + +sortAscending: bool?; + +sortableIcon: Widget? ] - [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] + [StandardTableColumn]o-[<abstract>TableColumnWidth] + [StandardTableColumn]o-[<abstract>Widget] - [InterventionPreview - | - +routeArgs: InterventionFormRouteArgs + [StandardTable | - +Widget build() + +items: List<T>; + +inputColumns: List<StandardTableColumn>; + +onSelectItem: void Function(T); + +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)?; + +trailingActionsMenuType: ActionMenuType?; + +sortColumnPredicates: List<int Function(T, T)?>?; + +pinnedPredicates: int Function(T, T)?; + +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; + +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; + +inputTrailingActionsColumn: StandardTableColumn; + +tableWrapper: Widget Function(Widget)?; + +cellSpacing: double; + +rowSpacing: double; + +minRowHeight: double?; + +showTableHeader: bool; + +hideLeadingTrailingWhenEmpty: bool; + +leadingWidget: Widget?; + +trailingWidget: Widget?; + +leadingWidgetSpacing: double?; + +trailingWidgetSpacing: double?; + +emptyWidget: Widget?; + +rowStyle: StandardTableStyle; + +disableRowInteractions: bool ] - [InterventionPreview]o-[InterventionFormRouteArgs] - [<abstract>ConsumerWidget]<:-[InterventionPreview] + [StandardTable]o-[void Function(T)] + [StandardTable]o-[List<ModelAction<dynamic>> Function(T, int)?] + [StandardTable]o-[ActionMenuType] + [StandardTable]o-[int Function(T, T)?] + [StandardTable]o-[TableRow Function(BuildContext, List<StandardTableColumn>)?] + [StandardTable]o-[StandardTableColumn] + [StandardTable]o-[Widget Function(Widget)?] + [StandardTable]o-[<abstract>Widget] + [StandardTable]o-[StandardTableStyle] - [StudyFormValidationSet + [StandardTableStyle | +index: int; - <static>+values: List<StudyFormValidationSet> + <static>+values: List<StandardTableStyle>; + <static>+plain: StandardTableStyle; + <static>+material: StandardTableStyle ] - [Enum]<:--[StudyFormValidationSet] + [StandardTableStyle]o-[StandardTableStyle] + [Enum]<:--[StandardTableStyle] - [StudyInfoFormData + [TwoColumnLayout | - +title: String; - +description: String?; - +iconName: String; - +contactInfoFormData: StudyContactInfoFormData; - +id: String + <static>+defaultDivider: VerticalDivider; + <static>+defaultContentPadding: EdgeInsets; + <static>+slimContentPadding: EdgeInsets; + +leftWidget: Widget; + +rightWidget: Widget; + +dividerWidget: Widget?; + +headerWidget: Widget?; + +flexLeft: int?; + +flexRight: int?; + +constraintsLeft: BoxConstraints?; + +constraintsRight: BoxConstraints?; + +scrollLeft: bool; + +scrollRight: bool; + +paddingLeft: EdgeInsets?; + +paddingRight: EdgeInsets?; + +backgroundColorLeft: Color?; + +backgroundColorRight: Color?; + +stretchHeight: bool + ] + + [TwoColumnLayout]o-[VerticalDivider] + [TwoColumnLayout]o-[EdgeInsets] + [TwoColumnLayout]o-[<abstract>Widget] + [TwoColumnLayout]o-[BoxConstraints] + [TwoColumnLayout]o-[Color] + + [NavbarTab | - +Study apply(); - +StudyInfoFormData copy() + +title: String; + +intent: RoutingIntent?; + +index: int; + +enabled: bool ] - [StudyInfoFormData]o-[StudyContactInfoFormData] - [<abstract>IStudyFormData]<:--[StudyInfoFormData] + [NavbarTab]o-[RoutingIntent] - [StudyContactInfoFormData + [TabbedNavbar | - +organization: String?; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String?; - +website: String?; - +phone: String?; - +additionalInfo: String?; - +id: String + +tabs: List<T>; + +selectedTab: T?; + +indicator: BoxDecoration?; + +height: double?; + +disabledBackgroundColor: Color?; + +disabledTooltipText: String?; + +onSelect: void Function(int, T)?; + +labelPadding: EdgeInsets?; + +labelSpacing: double?; + +indicatorSize: TabBarIndicatorSize?; + +isScrollable: bool; + +backgroundColor: Color?; + +labelColorHover: Color?; + +unselectedLabelColorHover: Color? + ] + + [TabbedNavbar]o-[BoxDecoration] + [TabbedNavbar]o-[Color] + [TabbedNavbar]o-[void Function(int, T)?] + [TabbedNavbar]o-[EdgeInsets] + [TabbedNavbar]o-[TabBarIndicatorSize] + + [FormTableRow | - +Study apply(); - +StudyInfoFormData copy() + +label: String?; + +labelBuilder: Widget Function(BuildContext)?; + +labelStyle: TextStyle?; + +labelHelpText: String?; + +input: Widget; + +control: AbstractControl<dynamic>?; + +layout: FormTableRowLayout? ] - [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] + [FormTableRow]o-[Widget Function(BuildContext)?] + [FormTableRow]o-[TextStyle] + [FormTableRow]o-[<abstract>Widget] + [FormTableRow]o-[<abstract>AbstractControl] + [FormTableRow]o-[FormTableRowLayout] - [StudyDesignInfoFormView + [FormTableLayout + | + +rows: List<FormTableRow>; + +columnWidths: Map<int, TableColumnWidth>; + +rowDivider: Widget?; + +rowLayout: FormTableRowLayout?; + +rowLabelStyle: TextStyle? | +Widget build() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] + [FormTableLayout]o-[<abstract>Widget] + [FormTableLayout]o-[FormTableRowLayout] + [FormTableLayout]o-[TextStyle] - [StudyInfoFormViewModel + [FormSectionHeader | - +study: Study; - +titleControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +descriptionControl: FormControl<String>; - +organizationControl: FormControl<String>; - +reviewBoardControl: FormControl<String>; - +reviewBoardNumberControl: FormControl<String>; - +researchersControl: FormControl<String>; - +emailControl: FormControl<String>; - +websiteControl: FormControl<String>; - +phoneControl: FormControl<String>; - +additionalInfoControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +iconRequired: dynamic; - +organizationRequired: dynamic; - +reviewBoardRequired: dynamic; - +reviewBoardNumberRequired: dynamic; - +researchersRequired: dynamic; - +emailRequired: dynamic; - +phoneRequired: dynamic; - +emailFormat: dynamic; - +websiteFormat: dynamic + +title: String; + +titleTextStyle: TextStyle?; + +helpText: String?; + +divider: bool; + +helpTextDisabled: bool | - +void setControlsFrom(); - +StudyInfoFormData buildFormData() + +Widget build() ] - [StudyInfoFormViewModel]o-[Study] - [StudyInfoFormViewModel]o-[FormControl] - [StudyInfoFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] + [FormSectionHeader]o-[TextStyle] - [MeasurementsFormViewModel + [FormLabel | - +study: Study; - +router: GoRouter; - +measurementsArray: FormArray<dynamic>; - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; - +form: FormGroup; - +measurementViewModels: List<MeasurementSurveyFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +measurementRequired: dynamic; - +titles: Map<FormMode, String> + +labelText: String?; + +helpText: String?; + +labelTextStyle: TextStyle?; + +layout: FormTableRowLayout? | - +void read(); - +void setControlsFrom(); - +MeasurementsFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +MeasurementSurveyFormViewModel provide(); - +void onCancel(); - +dynamic onSave() + +Widget build() ] - [MeasurementsFormViewModel]o-[Study] - [MeasurementsFormViewModel]o-[GoRouter] - [MeasurementsFormViewModel]o-[FormArray] - [MeasurementsFormViewModel]o-[FormViewModelCollection] - [MeasurementsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] + [FormLabel]o-[TextStyle] + [FormLabel]o-[FormTableRowLayout] - [StudyDesignMeasurementsFormView + [FormTableRowLayout | - +Widget build() + +index: int; + <static>+values: List<FormTableRowLayout>; + <static>+vertical: FormTableRowLayout; + <static>+horizontal: FormTableRowLayout ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] + [FormTableRowLayout]o-[FormTableRowLayout] + [Enum]<:--[FormTableRowLayout] - [SurveyPreview - | - +routeArgs: MeasurementFormRouteArgs + [NotificationDispatcher | - +Widget build() + +child: Widget?; + +snackbarInnerPadding: double; + +snackbarWidth: double?; + +snackbarBehavior: SnackBarBehavior; + +snackbarDefaultDuration: int ] - [SurveyPreview]o-[MeasurementFormRouteArgs] - [<abstract>ConsumerWidget]<:-[SurveyPreview] + [NotificationDispatcher]o-[<abstract>Widget] + [NotificationDispatcher]o-[SnackBarBehavior] - [MeasurementSurveyFormView + [<abstract>INotificationService | - +formViewModel: MeasurementSurveyFormViewModel + +void showMessage(); + +void show(); + +Stream<NotificationIntent> watchNotifications(); + +void dispose() ] - [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] - - [MeasurementSurveyFormViewModel + [NotificationService | - +study: Study; - +measurementIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +surveyTitleControl: FormControl<String>; - +surveyIntroTextControl: FormControl<String>; - +surveyOutroTextControl: FormControl<String>; - +form: FormGroup; - +measurementId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneQuestion: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> + -_streamController: BehaviorSubject<NotificationIntent> | - +void setControlsFrom(); - +MeasurementSurveyFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); - +SurveyQuestionFormRouteArgs buildFormRouteArgs(); - +MeasurementSurveyFormViewModel createDuplicate() + +Stream<NotificationIntent> watchNotifications(); + +void showMessage(); + +void show(); + +void dispose() ] - [MeasurementSurveyFormViewModel]o-[Study] - [MeasurementSurveyFormViewModel]o-[FormControl] - [MeasurementSurveyFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] + [NotificationService]o-[BehaviorSubject] + [<abstract>INotificationService]<:--[NotificationService] - [MeasurementSurveyFormData + [<abstract>NotificationIntent | - +measurementId: String; - +title: String; - +introText: String?; - +outroText: String?; - +questionnaireFormData: QuestionnaireFormData; - <static>+kDefaultTitle: String; - +id: String + +message: String?; + +customContent: Widget?; + +icon: IconData?; + +actions: List<NotificationAction>?; + +type: NotificationType | - +QuestionnaireTask toQuestionnaireTask(); - +MeasurementSurveyFormData copy() + +void register() ] - [MeasurementSurveyFormData]o-[QuestionnaireFormData] - [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] + [<abstract>NotificationIntent]o-[<abstract>Widget] + [<abstract>NotificationIntent]o-[IconData] + [<abstract>NotificationIntent]o-[NotificationType] - [MeasurementsFormData - | - +surveyMeasurements: List<MeasurementSurveyFormData>; - +id: String + [NotificationAction | - +Study apply(); - +MeasurementsFormData copy() + +label: String; + +onSelect: dynamic Function(); + +isDestructive: bool ] - [<abstract>IStudyFormData]<:--[MeasurementsFormData] + [NotificationAction]o-[dynamic Function()] - [<abstract>IStudyFormData + [SnackbarIntent | - +Study apply() + +duration: int? ] - [<abstract>IFormData]<:--[<abstract>IStudyFormData] + [<abstract>NotificationIntent]<:-[SnackbarIntent] - [<abstract>StudyDesignPageWidget + [AlertIntent | - +Widget? banner() + +title: String; + +dismissOnAction: bool; + +isDestructive: dynamic ] - [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] + [<abstract>NotificationIntent]<:-[AlertIntent] - [StudyFormScaffold - | - +studyId: String; - +formViewModelBuilder: T Function(WidgetRef); - +formViewBuilder: Widget Function(T) + [NotificationType | - +Widget build() + +index: int; + <static>+values: List<NotificationType>; + <static>+snackbar: NotificationType; + <static>+alert: NotificationType; + <static>+custom: NotificationType ] - [StudyFormScaffold]o-[T Function(WidgetRef)] - [StudyFormScaffold]o-[Widget Function(T)] - [<abstract>ConsumerWidget]<:-[StudyFormScaffold] + [NotificationType]o-[NotificationType] + [Enum]<:--[NotificationType] - [<abstract>WithScheduleControls - | - +isTimeRestrictedControl: FormControl<bool>; - +instanceID: FormControl<String>; - +restrictedTimeStartControl: FormControl<Time>; - +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; - +restrictedTimeEndControl: FormControl<Time>; - +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; - +hasReminderControl: FormControl<bool>; - +reminderTimeControl: FormControl<Time>; - +reminderTimePickerControl: FormControl<TimeOfDay>; - -_reminderControlStream: StreamSubscription<dynamic>?; - +scheduleFormControls: Map<String, FormControl<Object>>; - +hasReminder: bool; - +isTimeRestricted: bool; - +timeRestriction: List<Time>? + [<abstract>IClipboardService | - +void setScheduleControlsFrom(); - -dynamic _initReminderControl() + +dynamic copy() ] - [<abstract>WithScheduleControls]o-[FormControl] - [<abstract>WithScheduleControls]o-[StreamSubscription] - - [<abstract>IFormDataWithSchedule - | - +instanceId: String; - +isTimeLocked: bool; - +timeLockStart: StudyUTimeOfDay?; - +timeLockEnd: StudyUTimeOfDay?; - +hasReminder: bool; - +reminderTime: StudyUTimeOfDay? + [ClipboardService | - +Schedule toSchedule() + +dynamic copy() ] - [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] - [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] + [<abstract>IClipboardService]<:--[ClipboardService] - [ScheduleControls - | - +formViewModel: WithScheduleControls + [Notifications | - +Widget build(); - -List<FormTableRow> _conditionalTimeRestrictions() + <static>+passwordReset: SnackbarIntent; + <static>+passwordResetSuccess: SnackbarIntent; + <static>+studyDeleted: SnackbarIntent; + <static>+inviteCodeDeleted: SnackbarIntent; + <static>+inviteCodeClipped: SnackbarIntent; + <static>+studyDeleteConfirmation: AlertIntent ] - [ScheduleControls]o-[<abstract>WithScheduleControls] - [<abstract>FormConsumerWidget]<:-[ScheduleControls] + [Notifications]o-[SnackbarIntent] + [Notifications]o-[AlertIntent] - [QuestionFormViewModel - | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +form: FormGroup; - +questionId: String; - +questionType: SurveyQuestionType; - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; - +answerOptionsArray: FormArray<dynamic>; - +answerOptionsControls: List<AbstractControl<dynamic>>; - +validAnswerOptions: List<String>; - +boolOptions: List<AbstractControl<String>>; - +scaleMinValue: int; - +scaleMaxValue: int; - +scaleRange: int; - +scaleAllValueControls: List<AbstractControl<int>>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +questionTextRequired: dynamic; - +numValidChoiceOptions: dynamic; - +scaleRangeValid: dynamic; - +titles: Map<FormMode, String>; - +isAddOptionButtonVisible: bool; - +isMidValuesClearedInfoVisible: bool + [NotificationDefaultActions | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); - +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem(); - +QuestionFormViewModel createDuplicate() + <static>+cancel: NotificationAction ] - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + [NotificationDefaultActions]o-[NotificationAction] - [<abstract>QuestionFormData + [DrawerEntry | - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; - +questionId: String; - +questionText: String; - +questionInfoText: String?; - +questionType: SurveyQuestionType; - +responseOptionsValidity: Map<dynamic, bool>; - +responseOptions: List<dynamic>; - +id: String + +localizedTitle: String Function(); + +icon: IconData?; + +localizedHelpText: String Function()?; + +enabled: bool; + +onSelected: void Function(BuildContext, WidgetRef)?; + +title: String; + +helpText: String? | - +Question<dynamic> toQuestion(); - +EligibilityCriterion toEligibilityCriterion(); - +Answer<dynamic> constructAnswerFor(); - +dynamic setResponseOptionsValidityFrom(); - +QuestionFormData copy() + +void onClick() ] - [<abstract>QuestionFormData]o-[SurveyQuestionType] - [<abstract>IFormData]<:--[<abstract>QuestionFormData] + [DrawerEntry]o-[String Function()] + [DrawerEntry]o-[IconData] + [DrawerEntry]o-[String Function()?] + [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] - [ChoiceQuestionFormData + [GoRouterDrawerEntry | - +isMultipleChoice: bool; - +answerOptions: List<String>; - +responseOptions: List<String> + +intent: RoutingIntent | - +Question<dynamic> toQuestion(); - +QuestionFormData copy(); - -Choice _buildChoiceForValue(); - +Answer<dynamic> constructAnswerFor() + +void onClick() ] - [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] + [GoRouterDrawerEntry]o-[RoutingIntent] + [DrawerEntry]<:-[GoRouterDrawerEntry] - [BoolQuestionFormData - | - <static>+kResponseOptions: Map<String, bool>; - +responseOptions: List<String> + [AppDrawer | - +Question<dynamic> toQuestion(); - +BoolQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +title: String; + +width: int; + +leftPaddingEntries: double; + +logoPaddingVertical: double; + +logoPaddingHorizontal: double; + +logoMaxHeight: double; + +logoSectionMinHeight: double; + +logoSectionMaxHeight: double ] - [<abstract>QuestionFormData]<:-[BoolQuestionFormData] - - [ScaleQuestionFormData + [DashboardController | - +minValue: double; - +maxValue: double; - +minLabel: String?; - +maxLabel: String?; - +midValues: List<double?>; - +midLabels: List<String?>; - +stepSize: double; - +initialValue: double?; - +minColor: Color?; - +maxColor: Color?; - +responseOptions: List<double>; - +midAnnotations: List<Annotation> + +studyRepository: IStudyRepository; + +authRepository: IAuthRepository; + +userRepository: IUserRepository; + +router: GoRouter; + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>?; + +searchController: SearchController | - +ScaleQuestion toQuestion(); - +QuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + -dynamic _subscribeStudies(); + +dynamic setSearchText(); + +dynamic setStudiesFilter(); + +dynamic onSelectStudy(); + +dynamic onClickNewStudy(); + +dynamic pinStudy(); + +dynamic pinOffStudy(); + +void filterStudies(); + +void sortStudies(); + +bool isPinned(); + +List<ModelAction<dynamic>> availableActions(); + +void dispose() ] - [ScaleQuestionFormData]o-[Color] - [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] + [DashboardController]o-[<abstract>IStudyRepository] + [DashboardController]o-[<abstract>IAuthRepository] + [DashboardController]o-[<abstract>IUserRepository] + [DashboardController]o-[GoRouter] + [DashboardController]o-[StreamSubscription] + [DashboardController]o-[SearchController] + [<abstract>IModelActionProvider]<:--[DashboardController] - [<abstract>IScaleQuestionFormViewModel + [StudiesTable | - +isMidValuesClearedInfoVisible: bool + +studies: List<Study>; + +onSelect: void Function(Study); + +getActions: List<ModelAction<dynamic>> Function(Study); + +emptyWidget: Widget; + +pinnedStudies: Iterable<String>; + +dashboardController: DashboardController; + +pinnedPredicates: int Function(Study, Study); + -_sortColumns: List<int Function(Study, Study)?> + | + +Widget build(); + -List<Widget> _buildRow() ] - [ScaleQuestionFormView + [StudiesTable]o-[void Function(Study)] + [StudiesTable]o-[List<ModelAction<dynamic>> Function(Study)] + [StudiesTable]o-[<abstract>Widget] + [StudiesTable]o-[DashboardController] + [StudiesTable]o-[int Function(Study, Study)] + + [DashboardScaffold | - +formViewModel: QuestionFormViewModel + +body: Widget + | + +Widget build() ] - [ScaleQuestionFormView]o-[QuestionFormViewModel] + [DashboardScaffold]o-[<abstract>Widget] - [SurveyQuestionType + [StudiesFilter | +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType + <static>+values: List<StudiesFilter> ] - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] + [Enum]<:--[StudiesFilter] - [BoolQuestionFormView + [DashboardScreen | - +formViewModel: QuestionFormViewModel + +filter: StudiesFilter? + ] + + [DashboardScreen]o-[StudiesFilter] + + [StudyMonitorScreen | +Widget build() ] - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] + [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] - [ChoiceQuestionFormView + [CustomFormControl | - +formViewModel: QuestionFormViewModel + -_onValueChangedDebouncer: Debouncer?; + -_onStatusChangedDebouncer: Debouncer?; + +onValueChanged: void Function(T?)?; + +onStatusChanged: void Function(ControlStatus)?; + +onStatusChangedDebounceTime: int?; + +onValueChangedDebounceTime: int? | - +Widget build() + +void dispose() ] - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [CustomFormControl]o-[Debouncer] + [CustomFormControl]o-[void Function(T?)?] + [CustomFormControl]o-[void Function(ControlStatus)?] + [FormControl]<:-[CustomFormControl] - [SurveyQuestionFormView - | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool + [FormInvalidException ] - [SurveyQuestionFormView]o-[QuestionFormViewModel] + [Exception]<:--[FormInvalidException] - [QuestionnaireFormData + [FormConfigException | - +questionsData: List<QuestionFormData>?; - +id: String - | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() + +message: String? ] - [<abstract>IFormData]<:--[QuestionnaireFormData] + [Exception]<:--[FormConfigException] - [<abstract>WithQuestionnaireControls - | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> + [<abstract>IFormViewModelDelegate | - +void setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); - +void read(); - +void onCancel(); +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() + +void onCancel() ] - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] + [<abstract>IFormGroupController + | + +form: FormGroup + ] - [StudyDesignReportsFormView + [<abstract>IFormGroupController]o-[FormGroup] + + [FormControlOption | - +Widget build(); - -dynamic _showReportItemSidesheetWithArgs() + +value: T; + +label: String; + +description: String?; + +props: List<Object?> ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] + [<abstract>Equatable]<:-[FormControlOption] - [ReportsFormViewModel + [<abstract>FormViewModel | - +study: Study; - +router: GoRouter; - +reportItemDelegate: ReportFormItemDelegate; - +reportItemArray: FormArray<dynamic>; - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +form: FormGroup; - +reportItemModels: List<ReportItemFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_formData: T?; + -_formMode: FormMode; + -_validationSet: FormValidationSetEnum?; + +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>?; + +autosave: bool; + -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>>; + -_immediateFormChildrenListenerDebouncer: Debouncer?; + -_autosaveOperation: CancelableOperation<dynamic>?; + -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>>; + +prevFormValue: Map<String, dynamic>?; + <static>-_formKey: String; + +formData: T?; + +formMode: FormMode; + +isReadonly: bool; + +validationSet: FormValidationSetEnum?; + +isDirty: bool; + +title: String; + +isValid: bool; +titles: Map<FormMode, String>; - +canTestConsent: bool + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> | - +void setControlsFrom(); - +ReportsFormData buildFormData(); + -dynamic _setFormData(); + -dynamic _rememberDefaultControlValidators(); + -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators(); + -dynamic _disableAllControls(); + -dynamic _formModeUpdated(); + -dynamic _restoreControlsFromFormData(); + +void revalidate(); + -void _applyValidationSet(); +void read(); - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); - +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); - +dynamic testReport(); - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide() + +dynamic save(); + +dynamic cancel(); + +void enableAutosave(); + +void listenToImmediateFormChildren(); + +dynamic markFormGroupChanged(); + +void dispose(); + +void setControlsFrom(); + +T buildFormData(); + +void initControls() ] - [ReportsFormViewModel]o-[Study] - [ReportsFormViewModel]o-[GoRouter] - [ReportsFormViewModel]o-[ReportFormItemDelegate] - [ReportsFormViewModel]o-[FormArray] - [ReportsFormViewModel]o-[FormViewModelCollection] - [ReportsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[ReportsFormViewModel] + [<abstract>FormViewModel]o-[FormMode] + [<abstract>FormViewModel]o-[<abstract>FormValidationSetEnum] + [<abstract>FormViewModel]o-[<abstract>IFormViewModelDelegate] + [<abstract>FormViewModel]o-[Debouncer] + [<abstract>FormViewModel]o-[CancelableOperation] + [<abstract>IFormGroupController]<:--[<abstract>FormViewModel] - [ReportFormItemDelegate - | - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +owner: ReportsFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic + [FormMode | - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + +index: int; + <static>+values: List<FormMode>; + <static>+create: FormMode; + <static>+readonly: FormMode; + <static>+edit: FormMode ] - [ReportFormItemDelegate]o-[FormViewModelCollection] - [ReportFormItemDelegate]o-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] - [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] - [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] + [FormMode]o-[FormMode] + [Enum]<:--[FormMode] - [ReportItemFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: dynamic; - +sectionTypeBodyBuilder: Widget Function(BuildContext) + [<abstract>ManagedFormViewModel | - +Widget build(); - -dynamic _buildSectionText(); - -dynamic _buildSectionTypeHeader() + +ManagedFormViewModel<T> createDuplicate() ] - [ReportItemFormView]o-[ReportItemFormViewModel] - [ReportItemFormView]o-[Widget Function(BuildContext)] + [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] - [TemporalAggregationFormatted - | - -_value: TemporalAggregation; - <static>+values: List<TemporalAggregationFormatted>; - +value: TemporalAggregation; - +string: String; - +icon: IconData?; - +hashCode: int - | - +bool ==(); - +String toString(); - +String toJson(); - <static>+TemporalAggregationFormatted fromJson() + [FormViewModelNotFoundException ] - [TemporalAggregationFormatted]o-[TemporalAggregation] - [TemporalAggregationFormatted]o-[IconData] + [Exception]<:--[FormViewModelNotFoundException] - [ImprovementDirectionFormatted + [FormViewModelCollection | - -_value: ImprovementDirection; - <static>+values: List<ImprovementDirectionFormatted>; - +value: ImprovementDirection; - +string: String; - +icon: IconData?; - +hashCode: int + +formViewModels: List<T>; + +formArray: FormArray<dynamic>; + +stagedViewModels: List<T>; + +retrievableViewModels: List<T>; + +formData: List<D> | - +bool ==(); - +String toString(); - +String toJson(); - <static>+ImprovementDirectionFormatted fromJson() + +void add(); + +T remove(); + +T? findWhere(); + +T? removeWhere(); + +bool contains(); + +void stage(); + +T commit(); + +void reset(); + +void read() ] - [ImprovementDirectionFormatted]o-[ImprovementDirection] - [ImprovementDirectionFormatted]o-[IconData] + [FormViewModelCollection]o-[FormArray] - [ReportSectionType + [UnsavedChangesDialog | - +index: int; - <static>+values: List<ReportSectionType>; - <static>+average: ReportSectionType; - <static>+linearRegression: ReportSectionType + +Widget build() ] - [ReportSectionType]o-[ReportSectionType] - [Enum]<:--[ReportSectionType] - - [DataReferenceIdentifier + [<abstract>IFormData | - +hashCode: int + +id: String | - +bool ==() + +IFormData copy() ] - [DataReference]<:-[DataReferenceIdentifier] - - [DataReferenceEditor + [FormArrayTable | - +formControl: FormControl<DataReferenceIdentifier<T>>; - +availableTasks: List<Task>; - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + +control: AbstractControl<dynamic>; + +items: List<T>; + +onSelectItem: void Function(T); + +getActionsAt: List<ModelAction<dynamic>> Function(T, int); + +onNewItem: void Function()?; + +rowTitle: String Function(T); + +onNewItemLabel: String; + +sectionTitle: String?; + +sectionDescription: String?; + +emptyIcon: IconData?; + +emptyTitle: String?; + +emptyDescription: String?; + +sectionTitleDivider: bool?; + +rowPrefix: Widget Function(BuildContext, T, int)?; + +rowSuffix: Widget Function(BuildContext, T, int)?; + +leadingWidget: Widget?; + +itemsSectionPadding: EdgeInsets?; + +hideLeadingTrailingWhenEmpty: bool; + <static>+columns: List<StandardTableColumn> | - +FormTableRow buildFormTableRow(); - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + +Widget build(); + -List<Widget> _buildRow(); + -Widget _newItemButton() ] - [DataReferenceEditor]o-[FormControl] - [DataReferenceEditor]o-[ReactiveDropdownField] + [FormArrayTable]o-[<abstract>AbstractControl] + [FormArrayTable]o-[void Function(T)] + [FormArrayTable]o-[List<ModelAction<dynamic>> Function(T, int)] + [FormArrayTable]o-[void Function()?] + [FormArrayTable]o-[String Function(T)] + [FormArrayTable]o-[IconData] + [FormArrayTable]o-[Widget Function(BuildContext, T, int)?] + [FormArrayTable]o-[<abstract>Widget] + [FormArrayTable]o-[EdgeInsets] - [AverageSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> - | - +Widget build() - ] - - [AverageSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[AverageSectionFormView] - - [LinearRegressionSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> - | - +Widget build() + [<abstract>FormValidationSetEnum ] - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - - [ReportItemFormData + [FormControlValidation | - +isPrimary: bool; - +section: ReportSection; - +id: String + +control: AbstractControl<dynamic>; + +validators: List<Validator<dynamic>>; + +asyncValidators: List<AsyncValidator<dynamic>>?; + +validationMessages: Map<String, String Function(Object)> | - <static>+dynamic fromDomainModel(); - +ReportItemFormData copy() + +FormControlValidation merge() ] - [ReportItemFormData]o-[<abstract>ReportSection] - [<abstract>IFormData]<:-[ReportItemFormData] + [FormControlValidation]o-[<abstract>AbstractControl] - [ReportItemFormViewModel + [InviteCodeFormViewModel | - <static>+defaultSectionType: ReportSectionType; - +sectionIdControl: FormControl<String>; - +sectionTypeControl: FormControl<ReportSectionType>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +sectionControl: FormControl<ReportSection>; - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; - +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; - +alphaControl: FormControl<double>; - -_controlsBySectionType: Map<ReportSectionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +sectionBaseControls: Map<String, AbstractControl<dynamic>>; + +study: Study; + +inviteCodeRepository: IInviteCodeRepository; + +codeControl: FormControl<String>; + +codeControlValidationMessages: Map<String, String Function(dynamic)>; + +isPreconfiguredScheduleControl: FormControl<bool>; + +preconfiguredScheduleTypeControl: FormControl<PhaseSequence>; + +interventionAControl: FormControl<String>; + +interventionBControl: FormControl<String>; +form: FormGroup; - +sectionId: String; - +sectionType: ReportSectionType; - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +dataReferenceRequired: dynamic; - +aggregationRequired: dynamic; - +improvementDirectionRequired: dynamic; - +alphaConfidenceRequired: dynamic + +interventionControlOptions: List<FormControlOption<String>>; + +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; + +isPreconfiguredSchedule: bool; + +preconfiguredSchedule: List<String>? | - -List<FormControlValidation> _getValidationConfig(); - +ReportItemFormData buildFormData(); - +ReportItemFormViewModel createDuplicate(); - +dynamic onSectionTypeChanged(); - -void _updateFormControls(); - +void setControlsFrom() + +void initControls(); + -dynamic _uniqueInviteCode(); + +void regenerateCode(); + -String _generateCode(); + +StudyInvite buildFormData(); + +void setControlsFrom(); + +dynamic save() ] - [ReportItemFormViewModel]o-[ReportSectionType] - [ReportItemFormViewModel]o-[FormControl] - [ReportItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] + [InviteCodeFormViewModel]o-[Study] + [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] + [InviteCodeFormViewModel]o-[FormControl] + [InviteCodeFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] - [ReportsFormData - | - +reportItems: List<ReportItemFormData>; - +id: String + [EnrolledBadge | - +Study apply(); - +ReportsFormData copy() - ] - - [<abstract>IStudyFormData]<:--[ReportsFormData] - - [ReportStatus + +enrolledCount: int | - +index: int; - <static>+values: List<ReportStatus>; - <static>+primary: ReportStatus; - <static>+secondary: ReportStatus + +Widget build() ] - [ReportStatus]o-[ReportStatus] - [Enum]<:--[ReportStatus] - - [ReportBadge + [InviteCodeFormView | - +status: ReportStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool + +formViewModel: InviteCodeFormViewModel | - +Widget build() + +Widget build(); + -List<FormTableRow> _conditionalInterventionRows() ] - [ReportBadge]o-[ReportStatus] - [ReportBadge]o-[BadgeType] + [InviteCodeFormView]o-[InviteCodeFormViewModel] + [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] - [AppStatus + [StudyRecruitScreen | - +index: int; - <static>+values: List<AppStatus>; - <static>+initializing: AppStatus; - <static>+initialized: AppStatus + +Widget build(); + -Widget _inviteCodesSectionHeader(); + -Widget _newInviteCodeButton(); + -dynamic _onSelectInvite() ] - [AppStatus]o-[AppStatus] - [Enum]<:--[AppStatus] + [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] - [PublishDialog + [StudyRecruitController | - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[PublishDialog] - - [PublishConfirmationDialog + +inviteCodeRepository: IInviteCodeRepository; + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? | - +Widget build() + -dynamic _subscribeInvites(); + +Intervention? getIntervention(); + +int getParticipantCountForInvite(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void dispose() ] - [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] + [StudyRecruitController]o-[<abstract>IInviteCodeRepository] + [StudyRecruitController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyRecruitController] + [<abstract>IModelActionProvider]<:--[StudyRecruitController] - [PublishSuccessDialog + [StudyInvitesTable | - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] - - [StudyAnalyzeScreen + +invites: List<StudyInvite>; + +onSelect: void Function(StudyInvite); + +getActions: List<ModelAction<dynamic>> Function(StudyInvite); + +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite); + +getIntervention: Intervention? Function(String); + +getParticipantCountForInvite: int Function(StudyInvite) | - +Widget? banner(); - +Widget build() + +Widget build(); + -List<Widget> _buildRow() ] - [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] + [StudyInvitesTable]o-[void Function(StudyInvite)] + [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] + [StudyInvitesTable]o-[Intervention? Function(String)] + [StudyInvitesTable]o-[int Function(StudyInvite)] - [StudyAnalyzeController + [AuthScaffold | - +dynamic onExport() + +body: Widget; + +formKey: AuthFormKey; + +leftContentMinWidth: double; + +leftPanelMinWidth: double; + +leftPanelPadding: EdgeInsets ] - [StudyBaseController]<:-[StudyAnalyzeController] + [AuthScaffold]o-[<abstract>Widget] + [AuthScaffold]o-[AuthFormKey] + [AuthScaffold]o-[EdgeInsets] - [StudyBaseController + [SignupForm | - +studyId: String; - +studyRepository: IStudyRepository; - +router: GoRouter; - +studySubscription: StreamSubscription<WrappedModel<Study>>? + +formKey: AuthFormKey | - +dynamic subscribeStudy(); - +dynamic onStudySubscriptionUpdate(); - +dynamic onStudySubscriptionError(); - +void dispose() + +Widget build(); + -dynamic _onClickTermsOfUse(); + -dynamic _onClickPrivacyPolicy() ] - [StudyBaseController]o-[<abstract>IStudyRepository] - [StudyBaseController]o-[GoRouter] - [StudyBaseController]o-[StreamSubscription] + [SignupForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[SignupForm] - [StudyParticipationBadge + [PasswordRecoveryForm | - +participation: Participation; - +type: BadgeType; - +showPrefixIcon: bool + +formKey: AuthFormKey | +Widget build() ] - [StudyParticipationBadge]o-[Participation] - [StudyParticipationBadge]o-[BadgeType] + [PasswordRecoveryForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] - [RouteInformation + [PasswordForgotForm | - +route: String?; - +extra: String?; - +cmd: String?; - +data: String? + +formKey: AuthFormKey | - +String toString() + +Widget build() ] - [<abstract>PlatformController - | - +studyId: String; - +baseSrc: String; - +previewSrc: String; - +routeInformation: RouteInformation; - +frameWidget: Widget + [PasswordForgotForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] + + [AuthFormController | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void listen(); - +void send(); - +void openNewPage() + +authRepository: IAuthRepository; + +sharedPreferences: SharedPreferences; + +notificationService: INotificationService; + +router: GoRouter; + +emailControl: FormControl<String>; + +passwordControl: FormControl<String>; + +passwordConfirmationControl: FormControl<String>; + +rememberMeControl: FormControl<bool>; + +termsOfServiceControl: FormControl<bool>; + <static>+authValidationMessages: Map<String, String Function(dynamic)>; + +loginForm: FormGroup; + +signupForm: FormGroup; + +passwordForgotForm: FormGroup; + +passwordRecoveryForm: FormGroup; + +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>>; + -_formKey: AuthFormKey; + +shouldRemember: bool; + +formKey: AuthFormKey; + +form: FormGroup + | + -dynamic _onChangeFormKey(); + +dynamic resetControlsFor(); + -dynamic _forceValidationMessages(); + +dynamic signUp(); + -dynamic _signUp(); + +dynamic signIn(); + -dynamic _signInWith(); + +dynamic signOut(); + +dynamic resetPasswordForEmail(); + +dynamic sendPasswordResetLink(); + +dynamic recoverPassword(); + +dynamic updateUser(); + -void _setRememberMe(); + -void _delRememberMe(); + -void _initRememberMe() ] - [<abstract>PlatformController]o-[RouteInformation] - [<abstract>PlatformController]o-[<abstract>Widget] + [AuthFormController]o-[<abstract>IAuthRepository] + [AuthFormController]o-[SharedPreferences] + [AuthFormController]o-[<abstract>INotificationService] + [AuthFormController]o-[GoRouter] + [AuthFormController]o-[FormControl] + [AuthFormController]o-[FormGroup] + [AuthFormController]o-[AuthFormKey] + [<abstract>IFormGroupController]<:--[AuthFormController] - [WebController + [AuthFormKey | - +iFrameElement: IFrameElement + +index: int; + <static>+values: List<AuthFormKey>; + <static>+login: AuthFormKey; + <static>+signup: AuthFormKey; + <static>+passwordForgot: AuthFormKey; + <static>+passwordRecovery: AuthFormKey; + <static>-_loginSubmit: AuthFormKey; + <static>-_signupSubmit: AuthFormKey + ] + + [AuthFormKey]o-[AuthFormKey] + [Enum]<:--[AuthFormKey] + + [EmailTextField | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void openNewPage(); - +void listen(); - +void send() + +labelText: String; + +hintText: String?; + +formControlName: String?; + +formControl: FormControl<dynamic>? ] - [WebController]o-[IFrameElement] - [<abstract>PlatformController]<:-[WebController] + [EmailTextField]o-[FormControl] - [MobileController + [PasswordTextField | - +void openNewPage(); - +void refresh(); - +void registerViews(); - +void listen(); - +void send(); - +void navigate(); - +void activate(); - +void generateUrl() + +labelText: String; + +hintText: String?; + +formControlName: String?; + +formControl: FormControl<dynamic>? ] - [<abstract>PlatformController]<:-[MobileController] + [PasswordTextField]o-[FormControl] + + [StudyUJobsToBeDone + | + +Widget build() + ] + + [LoginForm + | + +formKey: AuthFormKey + | + +Widget build() + ] + + [LoginForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[LoginForm] + + [StudyAnalyzeController + | + +dynamic onExport() + ] + + [StudyBaseController]<:-[StudyAnalyzeController] + + [StudyAnalyzeScreen + | + +Widget? banner(); + +Widget build() + ] + + [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] + + [PublishDialog + | + +Widget build() + ] + + [<abstract>StudyPageWidget]<:-[PublishDialog] + + [PublishSuccessDialog + | + +Widget build() + ] + + [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] + + [PublishConfirmationDialog + | + +Widget build() + ] + + [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] + + [App + ] + + [AppContent + ] [<abstract>IStudyAppBarViewModel | @@ -2452,25 +2245,36 @@ [StudyScaffold]o-[<abstract>Widget] [StudyScaffold]o-[SingleColumnLayoutType] - [StudyController + [PreviewFrame | - +notificationService: INotificationService; - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; - +studyActions: List<ModelAction<dynamic>> + +studyId: String; + +routeArgs: StudyFormRouteArgs?; + +route: String? + ] + + [PreviewFrame]o-[<abstract>StudyFormRouteArgs] + + [StudyParticipationBadge | - +dynamic syncStudyStatus(); - +dynamic onStudySubscriptionUpdate(); - -dynamic _redirectNewToActualStudyID(); - +dynamic publishStudy(); - +void onChangeStudyParticipation(); - +void onAddParticipants(); - +void onSettingsPressed(); - +void dispose() + +participation: Participation; + +type: BadgeType; + +showPrefixIcon: bool + | + +Widget build() ] - [StudyController]o-[<abstract>INotificationService] - [StudyController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyController] + [StudyParticipationBadge]o-[Participation] + [StudyParticipationBadge]o-[BadgeType] + + [<abstract>StudyPageWidget + | + +studyId: String + | + +Widget? banner() + ] + + [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] + [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] [<abstract>IStudyStatusBadgeViewModel | @@ -2496,25 +2300,31 @@ [StudyStatusBadge]o-[StudyStatus] [StudyStatusBadge]o-[BadgeType] - [StudyTestController + [FrameControlsWidget | - +authRepository: IAuthRepository; - +languageCode: String + +onRefresh: void Function()?; + +onOpenNewTab: void Function()?; + +enabled: bool + | + +Widget build() ] - [StudyTestController]o-[<abstract>IAuthRepository] - [StudyBaseController]<:-[StudyTestController] + [FrameControlsWidget]o-[void Function()?] + [<abstract>ConsumerWidget]<:-[FrameControlsWidget] - [TestAppRoutes + [StudyTestScreen | - <static>+studyOverview: String; - <static>+eligibility: String; - <static>+intervention: String; - <static>+consent: String; - <static>+journey: String; - <static>+dashboard: String + +previewRoute: String? + | + +Widget build(); + +Widget? banner(); + +dynamic load(); + +dynamic save(); + +dynamic showHelp() ] + [<abstract>StudyPageWidget]<:-[StudyTestScreen] + [<abstract>IStudyNavViewModel | +isEditTabEnabled: bool; @@ -2545,80 +2355,115 @@ <static>+dynamic reports() ] - [StudySettingsDialog + [RouteInformation | - +Widget build() + +route: String?; + +extra: String?; + +cmd: String?; + +data: String? + | + +String toString() ] - [<abstract>StudyPageWidget]<:-[StudySettingsDialog] - - [StudySettingsFormViewModel + [<abstract>PlatformController | - +study: AsyncValue<Study>; - +studyRepository: IStudyRepository; - <static>+defaultPublishedToRegistry: bool; - <static>+defaultPublishedToRegistryResults: bool; - +isPublishedToRegistryControl: FormControl<bool>; - +isPublishedToRegistryResultsControl: FormControl<bool>; - +form: FormGroup; - +titles: Map<FormMode, String> + +studyId: String; + +baseSrc: String; + +previewSrc: String; + +routeInformation: RouteInformation; + +frameWidget: Widget | - +void setControlsFrom(); - +Study buildFormData(); - +dynamic keepControlsSynced(); - +dynamic save(); - +dynamic setLaunchDefaults() + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void listen(); + +void send(); + +void openNewPage() ] - [StudySettingsFormViewModel]o-[<abstract>AsyncValue] - [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] - [StudySettingsFormViewModel]o-[FormControl] - [StudySettingsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] + [<abstract>PlatformController]o-[RouteInformation] + [<abstract>PlatformController]o-[<abstract>Widget] - [<abstract>StudyPageWidget + [WebController | - +studyId: String + +iFrameElement: IFrameElement | - +Widget? banner() + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void openNewPage(); + +void listen(); + +void send() ] - [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] - [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] + [WebController]o-[IFrameElement] + [<abstract>PlatformController]<:-[WebController] - [StudyTestScreen + [MobileController | - +previewRoute: String? + +void openNewPage(); + +void refresh(); + +void registerViews(); + +void listen(); + +void send(); + +void navigate(); + +void activate(); + +void generateUrl() + ] + + [<abstract>PlatformController]<:-[MobileController] + + [StudySettingsFormViewModel | - +Widget build(); - +Widget? banner(); - +dynamic load(); + +study: AsyncValue<Study>; + +studyRepository: IStudyRepository; + <static>+defaultPublishedToRegistry: bool; + <static>+defaultPublishedToRegistryResults: bool; + +isPublishedToRegistryControl: FormControl<bool>; + +isPublishedToRegistryResultsControl: FormControl<bool>; + +form: FormGroup; + +titles: Map<FormMode, String> + | + +void setControlsFrom(); + +Study buildFormData(); + +dynamic keepControlsSynced(); +dynamic save(); - +dynamic showHelp() + +dynamic setLaunchDefaults() ] - [<abstract>StudyPageWidget]<:-[StudyTestScreen] + [StudySettingsFormViewModel]o-[<abstract>AsyncValue] + [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] + [StudySettingsFormViewModel]o-[FormControl] + [StudySettingsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] - [FrameControlsWidget - | - +onRefresh: void Function()?; - +onOpenNewTab: void Function()?; - +enabled: bool + [StudySettingsDialog | +Widget build() ] - [FrameControlsWidget]o-[void Function()?] - [<abstract>ConsumerWidget]<:-[FrameControlsWidget] + [<abstract>StudyPageWidget]<:-[StudySettingsDialog] - [PreviewFrame + [StudyBaseController | +studyId: String; - +routeArgs: StudyFormRouteArgs?; - +route: String? + +studyRepository: IStudyRepository; + +router: GoRouter; + +studySubscription: StreamSubscription<WrappedModel<Study>>? + | + +dynamic subscribeStudy(); + +dynamic onStudySubscriptionUpdate(); + +dynamic onStudySubscriptionError(); + +void dispose() ] - [PreviewFrame]o-[<abstract>StudyFormRouteArgs] + [StudyBaseController]o-[<abstract>IStudyRepository] + [StudyBaseController]o-[GoRouter] + [StudyBaseController]o-[StreamSubscription] [WebFrame | @@ -2661,9141 +2506,9292 @@ +Widget build() ] - [StudiesFilter + [StudyTestController | - +index: int; - <static>+values: List<StudiesFilter> + +authRepository: IAuthRepository; + +languageCode: String ] - [Enum]<:--[StudiesFilter] + [StudyTestController]o-[<abstract>IAuthRepository] + [StudyBaseController]<:-[StudyTestController] - [DashboardScaffold + [StudyController | - +body: Widget + +notificationService: INotificationService; + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; + +studyActions: List<ModelAction<dynamic>> | - +Widget build() + +dynamic syncStudyStatus(); + +dynamic onStudySubscriptionUpdate(); + -dynamic _redirectNewToActualStudyID(); + +dynamic publishStudy(); + +void onChangeStudyParticipation(); + +void onAddParticipants(); + +void onSettingsPressed(); + +void dispose() ] - [DashboardScaffold]o-[<abstract>Widget] + [StudyController]o-[<abstract>INotificationService] + [StudyController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyController] - [StudiesTable - | - +studies: List<Study>; - +onSelect: void Function(Study); - +getActions: List<ModelAction<dynamic>> Function(Study); - +emptyWidget: Widget + [TestAppRoutes | - +Widget build(); - -List<Widget> _buildRow() + <static>+studyOverview: String; + <static>+eligibility: String; + <static>+intervention: String; + <static>+consent: String; + <static>+journey: String; + <static>+dashboard: String ] - [StudiesTable]o-[void Function(Study)] - [StudiesTable]o-[List<ModelAction<dynamic>> Function(Study)] - [StudiesTable]o-[<abstract>Widget] - - [DashboardScreen + [StudyDesignInfoFormView | - +filter: StudiesFilter? + +Widget build() ] - [DashboardScreen]o-[StudiesFilter] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] - [DashboardController + [StudyInfoFormViewModel | - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +router: GoRouter; - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + +study: Study; + +titleControl: FormControl<String>; + +iconControl: FormControl<IconOption>; + +descriptionControl: FormControl<String>; + +organizationControl: FormControl<String>; + +reviewBoardControl: FormControl<String>; + +reviewBoardNumberControl: FormControl<String>; + +researchersControl: FormControl<String>; + +emailControl: FormControl<String>; + +websiteControl: FormControl<String>; + +phoneControl: FormControl<String>; + +additionalInfoControl: FormControl<String>; + +form: FormGroup; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +iconRequired: dynamic; + +organizationRequired: dynamic; + +reviewBoardRequired: dynamic; + +reviewBoardNumberRequired: dynamic; + +researchersRequired: dynamic; + +emailRequired: dynamic; + +phoneRequired: dynamic; + +emailFormat: dynamic; + +websiteFormat: dynamic | - -dynamic _subscribeStudies(); - +dynamic setStudiesFilter(); - +dynamic onSelectStudy(); - +dynamic onClickNewStudy(); - +List<ModelAction<dynamic>> availableActions(); - +void dispose() + +void setControlsFrom(); + +StudyInfoFormData buildFormData() ] - [DashboardController]o-[<abstract>IStudyRepository] - [DashboardController]o-[<abstract>IAuthRepository] - [DashboardController]o-[GoRouter] - [DashboardController]o-[StreamSubscription] - [<abstract>IModelActionProvider]<:--[DashboardController] + [StudyInfoFormViewModel]o-[Study] + [StudyInfoFormViewModel]o-[FormControl] + [StudyInfoFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] - [StudyMonitorScreen + [StudyInfoFormData | - +Widget build() + +title: String; + +description: String?; + +iconName: String; + +contactInfoFormData: StudyContactInfoFormData; + +id: String + | + +Study apply(); + +StudyInfoFormData copy() ] - [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] + [StudyInfoFormData]o-[StudyContactInfoFormData] + [<abstract>IStudyFormData]<:--[StudyInfoFormData] - [AccountSettingsDialog + [StudyContactInfoFormData | - +Widget build() + +organization: String?; + +institutionalReviewBoard: String?; + +institutionalReviewBoardNumber: String?; + +researchers: String?; + +email: String?; + +website: String?; + +phone: String?; + +additionalInfo: String?; + +id: String + | + +Study apply(); + +StudyInfoFormData copy() ] - [<abstract>ConsumerWidget]<:-[AccountSettingsDialog] + [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - [App + [StudyFormScaffold + | + +studyId: String; + +formViewModelBuilder: T Function(WidgetRef); + +formViewBuilder: Widget Function(T) + | + +Widget build() ] - [AppContent - ] + [StudyFormScaffold]o-[T Function(WidgetRef)] + [StudyFormScaffold]o-[Widget Function(T)] + [<abstract>ConsumerWidget]<:-[StudyFormScaffold] - [Assets + [StudyFormValidationSet | - <static>+logoWide: String + +index: int; + <static>+values: List<StudyFormValidationSet> ] - [<abstract>ResultTypes - ] + [Enum]<:--[StudyFormValidationSet] - [MeasurementResultTypes + [StudyDesignMeasurementsFormView | - <static>+questionnaire: String; - <static>+values: List<String> + +Widget build() ] - [<abstract>ResultTypes]<:-[MeasurementResultTypes] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] - [InterventionResultTypes + [MeasurementsFormViewModel | - <static>+checkmarkTask: String; - <static>+values: List<String> + +study: Study; + +router: GoRouter; + +measurementsArray: FormArray<dynamic>; + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; + +form: FormGroup; + +measurementViewModels: List<MeasurementSurveyFormViewModel>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +measurementRequired: dynamic; + +titles: Map<FormMode, String> + | + +void read(); + +void setControlsFrom(); + +MeasurementsFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +MeasurementSurveyFormViewModel provide(); + +void onCancel(); + +dynamic onSave() ] - [<abstract>ResultTypes]<:-[InterventionResultTypes] + [MeasurementsFormViewModel]o-[Study] + [MeasurementsFormViewModel]o-[GoRouter] + [MeasurementsFormViewModel]o-[FormArray] + [MeasurementsFormViewModel]o-[FormViewModelCollection] + [MeasurementsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] + [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] - [StudyExportData + [MeasurementsFormData | - +study: Study; - +measurementsData: List<Map<String, dynamic>>; - +interventionsData: List<Map<String, dynamic>>; - +isEmpty: bool + +surveyMeasurements: List<MeasurementSurveyFormData>; + +id: String + | + +Study apply(); + +MeasurementsFormData copy() ] - [StudyExportData]o-[Study] + [<abstract>IStudyFormData]<:--[MeasurementsFormData] - [StudyTemplates + [MeasurementSurveyFormViewModel | - <static>+kUnnamedStudyTitle: String + +study: Study; + +measurementIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +surveyTitleControl: FormControl<String>; + +surveyIntroTextControl: FormControl<String>; + +surveyOutroTextControl: FormControl<String>; + +form: FormGroup; + +measurementId: String; + +instanceId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +atLeastOneQuestion: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> | - <static>+Study emptyDraft() + +void setControlsFrom(); + +MeasurementSurveyFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); + +SurveyQuestionFormRouteArgs buildFormRouteArgs(); + +MeasurementSurveyFormViewModel createDuplicate() ] - [StudyActionType + [MeasurementSurveyFormViewModel]o-[Study] + [MeasurementSurveyFormViewModel]o-[FormControl] + [MeasurementSurveyFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] + [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] + [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] + + [MeasurementSurveyFormData | - +index: int; - <static>+values: List<StudyActionType>; - <static>+edit: StudyActionType; - <static>+duplicate: StudyActionType; - <static>+duplicateDraft: StudyActionType; - <static>+addCollaborator: StudyActionType; - <static>+export: StudyActionType; - <static>+delete: StudyActionType + +measurementId: String; + +title: String; + +introText: String?; + +outroText: String?; + +questionnaireFormData: QuestionnaireFormData; + <static>+kDefaultTitle: String; + +id: String + | + +QuestionnaireTask toQuestionnaireTask(); + +MeasurementSurveyFormData copy() ] - [StudyActionType]o-[StudyActionType] - [Enum]<:--[StudyActionType] + [MeasurementSurveyFormData]o-[QuestionnaireFormData] + [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] - [StudyLaunched + [SurveyPreview + | + +routeArgs: MeasurementFormRouteArgs + | + +Widget build() ] - [<abstract>ModelEvent]<:-[StudyLaunched] + [SurveyPreview]o-[MeasurementFormRouteArgs] + [<abstract>ConsumerWidget]<:-[SurveyPreview] - [<abstract>IStudyRepository + [MeasurementSurveyFormView | - +dynamic launch(); - +dynamic deleteParticipants() + +formViewModel: MeasurementSurveyFormViewModel ] - [<abstract>ModelRepository]<:--[<abstract>IStudyRepository] + [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] - [StudyRepository - | - +apiClient: StudyUApi; - +authRepository: IAuthRepository; - +ref: ProviderRef<dynamic> + [<abstract>IStudyFormData | - +String getKey(); - +dynamic deleteParticipants(); - +dynamic launch(); - +List<ModelAction<dynamic>> availableActions() + +Study apply() ] - [StudyRepository]o-[<abstract>StudyUApi] - [StudyRepository]o-[<abstract>IAuthRepository] - [StudyRepository]o-[<abstract>ProviderRef] - [<abstract>ModelRepository]<:-[StudyRepository] - [<abstract>IStudyRepository]<:--[StudyRepository] + [<abstract>IFormData]<:--[<abstract>IStudyFormData] - [StudyRepositoryDelegate + [ReportsFormViewModel | - +apiClient: StudyUApi; - +authRepository: IAuthRepository + +study: Study; + +router: GoRouter; + +reportItemDelegate: ReportFormItemDelegate; + +reportItemArray: FormArray<dynamic>; + +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; + +form: FormGroup; + +reportItemModels: List<ReportItemFormViewModel>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titles: Map<FormMode, String>; + +canTestConsent: bool | - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +dynamic onError(); - +Study createNewInstance(); - +Study createDuplicate() + +void setControlsFrom(); + +ReportsFormData buildFormData(); + +void read(); + +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); + +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); + +dynamic testReport(); + +void onCancel(); + +dynamic onSave(); + +ReportItemFormViewModel provide() ] - [StudyRepositoryDelegate]o-[<abstract>StudyUApi] - [StudyRepositoryDelegate]o-[<abstract>IAuthRepository] - [<abstract>IModelRepositoryDelegate]<:-[StudyRepositoryDelegate] + [ReportsFormViewModel]o-[Study] + [ReportsFormViewModel]o-[GoRouter] + [ReportsFormViewModel]o-[ReportFormItemDelegate] + [ReportsFormViewModel]o-[FormArray] + [ReportsFormViewModel]o-[FormViewModelCollection] + [ReportsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[ReportsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[ReportsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[ReportsFormViewModel] - [<abstract>ModelEvent + [ReportFormItemDelegate | - +modelId: String; - +model: T - ] - - [IsFetched + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; + +owner: ReportsFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic + | + +void onCancel(); + +dynamic onSave(); + +ReportItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() ] - [<abstract>ModelEvent]<:-[IsFetched] + [ReportFormItemDelegate]o-[FormViewModelCollection] + [ReportFormItemDelegate]o-[ReportsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] + [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] + [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] - [IsSaving + [ReportItemFormView + | + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: dynamic; + +sectionTypeBodyBuilder: Widget Function(BuildContext) + | + +Widget build(); + -dynamic _buildSectionText(); + -dynamic _buildSectionTypeHeader() ] - [<abstract>ModelEvent]<:-[IsSaving] + [ReportItemFormView]o-[ReportItemFormViewModel] + [ReportItemFormView]o-[Widget Function(BuildContext)] - [IsSaved + [LinearRegressionSectionFormView + | + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> + | + +Widget build() ] - [<abstract>ModelEvent]<:-[IsSaved] + [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - [IsDeleted + [DataReferenceIdentifier + | + +hashCode: int + | + +bool ==() ] - [<abstract>ModelEvent]<:-[IsDeleted] + [DataReference]<:-[DataReferenceIdentifier] - [<abstract>IAppRepository + [DataReferenceEditor | - +dynamic fetchAppConfig(); - +void dispose() + +formControl: FormControl<DataReferenceIdentifier<T>>; + +availableTasks: List<Task>; + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + | + +FormTableRow buildFormTableRow(); + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() ] - [AppRepository + [DataReferenceEditor]o-[FormControl] + [DataReferenceEditor]o-[ReactiveDropdownField] + + [TemporalAggregationFormatted | - +apiClient: StudyUApi + -_value: TemporalAggregation; + <static>+values: List<TemporalAggregationFormatted>; + +value: TemporalAggregation; + +string: String; + +icon: IconData?; + +hashCode: int | - +dynamic fetchAppConfig(); - +void dispose() + +bool ==(); + +String toString(); + +String toJson(); + <static>+TemporalAggregationFormatted fromJson() ] - [AppRepository]o-[<abstract>StudyUApi] - [<abstract>IAppRepository]<:--[AppRepository] + [TemporalAggregationFormatted]o-[TemporalAggregation] + [TemporalAggregationFormatted]o-[IconData] - [WrappedModel + [ImprovementDirectionFormatted | - -_model: T; - +asyncValue: AsyncValue<T>; - +isLocalOnly: bool; - +isDirty: bool; - +isDeleted: bool; - +lastSaved: DateTime?; - +lastFetched: DateTime?; - +lastUpdated: DateTime?; - +model: T + -_value: ImprovementDirection; + <static>+values: List<ImprovementDirectionFormatted>; + +value: ImprovementDirection; + +string: String; + +icon: IconData?; + +hashCode: int | - +dynamic markWithError(); - +dynamic markAsLoading(); - +dynamic markAsFetched(); - +dynamic markAsSaved() - ] - - [WrappedModel]o-[<abstract>AsyncValue] - - [ModelRepositoryException + +bool ==(); + +String toString(); + +String toJson(); + <static>+ImprovementDirectionFormatted fromJson() ] - [Exception]<:--[ModelRepositoryException] + [ImprovementDirectionFormatted]o-[ImprovementDirection] + [ImprovementDirectionFormatted]o-[IconData] - [ModelNotFoundException + [ReportSectionType + | + +index: int; + <static>+values: List<ReportSectionType>; + <static>+average: ReportSectionType; + <static>+linearRegression: ReportSectionType ] - [ModelRepositoryException]<:--[ModelNotFoundException] + [ReportSectionType]o-[ReportSectionType] + [Enum]<:--[ReportSectionType] - [<abstract>IModelRepository + [AverageSectionFormView | - +String getKey(); - +WrappedModel<T>? get(); - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +dynamic duplicateAndSave(); - +dynamic duplicateAndSaveFromRemote(); - +Stream<WrappedModel<T>> watch(); - +Stream<List<WrappedModel<T>>> watchAll(); - +Stream<ModelEvent<T>> watchChanges(); - +Stream<ModelEvent<T>> watchAllChanges(); - +dynamic ensurePersisted(); - +void dispose() + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> + | + +Widget build() ] - [<abstract>IModelActionProvider]<:--[<abstract>IModelRepository] + [AverageSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[AverageSectionFormView] - [<abstract>IModelRepositoryDelegate + [ReportItemFormViewModel | - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +T createNewInstance(); - +T createDuplicate(); - +dynamic onError() + <static>+defaultSectionType: ReportSectionType; + +sectionIdControl: FormControl<String>; + +sectionTypeControl: FormControl<ReportSectionType>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +sectionControl: FormControl<ReportSection>; + +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; + +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; + +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; + +alphaControl: FormControl<double>; + -_controlsBySectionType: Map<ReportSectionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +sectionBaseControls: Map<String, AbstractControl<dynamic>>; + +form: FormGroup; + +sectionId: String; + +sectionType: ReportSectionType; + <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; + <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; + <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +dataReferenceRequired: dynamic; + +aggregationRequired: dynamic; + +improvementDirectionRequired: dynamic; + +alphaConfidenceRequired: dynamic + | + -List<FormControlValidation> _getValidationConfig(); + +ReportItemFormData buildFormData(); + +ReportItemFormViewModel createDuplicate(); + +dynamic onSectionTypeChanged(); + -void _updateFormControls(); + +void setControlsFrom() ] - [<abstract>ModelRepository + [ReportItemFormViewModel]o-[ReportSectionType] + [ReportItemFormViewModel]o-[FormControl] + [ReportItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] + + [ReportItemFormData | - +delegate: IModelRepositoryDelegate<T>; - -_allModelsStreamController: BehaviorSubject<List<WrappedModel<T>>>; - -_allModelEventsStreamController: BehaviorSubject<ModelEvent<T>>; - +modelStreamControllers: Map<String, BehaviorSubject<WrappedModel<T>>>; - +modelEventsStreamControllers: Map<String, BehaviorSubject<ModelEvent<T>>>; - -_allModels: Map<String, WrappedModel<T>> + +isPrimary: bool; + +section: ReportSection; + +id: String | - +WrappedModel<T>? get(); - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +dynamic duplicateAndSave(); - +dynamic duplicateAndSaveFromRemote(); - +Stream<List<WrappedModel<T>>> watchAll(); - +Stream<WrappedModel<T>> watch(); - +Stream<ModelEvent<T>> watchAllChanges(); - +Stream<ModelEvent<T>> watchChanges(); - -dynamic _buildModelSpecificController(); - +dynamic ensurePersisted(); - +WrappedModel<T> upsertLocally(); - +List<WrappedModel<T>> upsertAllLocally(); - +dynamic emitUpdate(); - +dynamic emitModelEvent(); - +dynamic emitError(); - +void dispose(); - +List<ModelAction<dynamic>> availableActions() + <static>+dynamic fromDomainModel(); + +ReportItemFormData copy() ] - [<abstract>ModelRepository]o-[<abstract>IModelRepositoryDelegate] - [<abstract>ModelRepository]o-[BehaviorSubject] - [<abstract>IModelRepository]<:-[<abstract>ModelRepository] + [ReportItemFormData]o-[<abstract>ReportSection] + [<abstract>IFormData]<:-[ReportItemFormData] - [<abstract>StudyUApi + [ReportsFormData | - +dynamic saveStudy(); - +dynamic fetchStudy(); - +dynamic getUserStudies(); - +dynamic deleteStudy(); - +dynamic saveStudyInvite(); - +dynamic fetchStudyInvite(); - +dynamic deleteStudyInvite(); - +dynamic deleteParticipants(); - +dynamic fetchAppConfig() - ] - - [APIException + +reportItems: List<ReportItemFormData>; + +id: String + | + +Study apply(); + +ReportsFormData copy() ] - [Exception]<:--[APIException] + [<abstract>IStudyFormData]<:--[ReportsFormData] - [StudyNotFoundException + [ReportStatus + | + +index: int; + <static>+values: List<ReportStatus>; + <static>+primary: ReportStatus; + <static>+secondary: ReportStatus ] - [APIException]<:-[StudyNotFoundException] + [ReportStatus]o-[ReportStatus] + [Enum]<:--[ReportStatus] - [MeasurementNotFoundException + [StudyDesignReportsFormView + | + +Widget build(); + -dynamic _showReportItemSidesheetWithArgs() ] - [APIException]<:-[MeasurementNotFoundException] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] - [QuestionNotFoundException + [ReportBadge + | + +status: ReportStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool + | + +Widget build() ] - [APIException]<:-[QuestionNotFoundException] + [ReportBadge]o-[ReportStatus] + [ReportBadge]o-[BadgeType] - [ConsentItemNotFoundException + [StudyDesignEnrollmentFormView + | + +Widget build(); + -dynamic _showScreenerQuestionSidesheetWithArgs(); + -dynamic _showConsentItemSidesheetWithArgs() ] - [APIException]<:-[ConsentItemNotFoundException] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] - [InterventionNotFoundException + [ConsentItemFormData + | + +consentId: String; + +title: String; + +description: String; + +iconName: String?; + +id: String + | + +ConsentItem toConsentItem(); + +ConsentItemFormData copy() ] - [APIException]<:-[InterventionNotFoundException] + [<abstract>IFormData]<:-[ConsentItemFormData] - [InterventionTaskNotFoundException + [EnrollmentFormData + | + <static>+kDefaultEnrollmentType: Participation; + +enrollmentType: Participation; + +questionnaireFormData: QuestionnaireFormData; + +consentItemsFormData: List<ConsentItemFormData>?; + +id: String + | + +Study apply(); + +EnrollmentFormData copy() ] - [APIException]<:-[InterventionTaskNotFoundException] + [EnrollmentFormData]o-[Participation] + [EnrollmentFormData]o-[QuestionnaireFormData] + [<abstract>IStudyFormData]<:--[EnrollmentFormData] - [ReportNotFoundException + [ConsentItemFormViewModel + | + +consentIdControl: FormControl<String>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +iconControl: FormControl<IconOption>; + +form: FormGroup; + +consentId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +titles: Map<FormMode, String> + | + +void setControlsFrom(); + +ConsentItemFormData buildFormData(); + +ConsentItemFormViewModel createDuplicate() ] - [APIException]<:-[ReportNotFoundException] + [ConsentItemFormViewModel]o-[FormControl] + [ConsentItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] - [ReportSectionNotFoundException + [<abstract>IScreenerQuestionLogicFormViewModel + | + +isDirtyOptionsBannerVisible: bool ] - [APIException]<:-[ReportSectionNotFoundException] - - [StudyInviteNotFoundException + [ScreenerQuestionLogicFormView + | + +formViewModel: ScreenerQuestionFormViewModel + | + +Widget build(); + -dynamic _buildInfoBanner(); + -dynamic _buildAnswerOptionsLogicControls(); + -List<Widget> _buildOptionLogicRow() ] - [APIException]<:-[StudyInviteNotFoundException] + [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] + [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] - [StudyUApiClient + [ScreenerQuestionFormViewModel | - +supabaseClient: SupabaseClient; - <static>+studyColumns: List<String>; - <static>+studyWithParticipantActivityColumns: List<String>; - +testDelayMilliseconds: int + <static>+defaultResponseOptionValidity: bool; + +responseOptionsDisabledArray: FormArray<dynamic>; + +responseOptionsLogicControls: FormArray<bool>; + +responseOptionsLogicDescriptionControls: FormArray<String>; + -_questionBaseControls: Map<String, AbstractControl<dynamic>>; + +prevResponseOptionControls: List<AbstractControl<dynamic>>; + +prevResponseOptionValues: List<dynamic>; + +responseOptionsDisabledControls: List<AbstractControl<dynamic>>; + +logicControlOptions: List<FormControlOption<bool>>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isDirtyOptionsBannerVisible: bool | - +dynamic deleteParticipants(); - +dynamic getUserStudies(); - +dynamic fetchStudy(); - +dynamic deleteStudy(); - +dynamic saveStudy(); - +dynamic fetchStudyInvite(); - +dynamic saveStudyInvite(); - +dynamic deleteStudyInvite(); - +dynamic fetchAppConfig(); - -dynamic _awaitGuarded(); - -dynamic _apiException(); - -dynamic _testDelay() + +dynamic onResponseOptionsChanged(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + -List<FormControl<dynamic>> _copyFormControls(); + -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); + -AbstractControl<dynamic>? _findAssociatedControlFor(); + +ScreenerQuestionFormViewModel createDuplicate() ] - [StudyUApiClient]o-[SupabaseClient] - [<abstract>SupabaseClientDependant]<:-[StudyUApiClient] - [<abstract>SupabaseQueryMixin]<:-[StudyUApiClient] - [<abstract>StudyUApi]<:--[StudyUApiClient] + [ScreenerQuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] + [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] - [<abstract>IAuthRepository + [EnrollmentFormViewModel | - +allowPasswordReset: bool; - +currentUser: User?; - +isLoggedIn: bool; - +session: Session? + +study: Study; + +router: GoRouter; + +consentItemDelegate: EnrollmentFormConsentItemDelegate; + +enrollmentTypeControl: FormControl<Participation>; + +consentItemArray: FormArray<dynamic>; + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +form: FormGroup; + +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; + +consentItemModels: List<ConsentItemFormViewModel>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titles: Map<FormMode, String>; + +canTestScreener: bool; + +canTestConsent: bool; + +questionTitles: Map<FormMode, String Function()> | - +dynamic signUp(); - +dynamic signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic updateUser(); - +void dispose() + +void setControlsFrom(); + +EnrollmentFormData buildFormData(); + +void read(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); + +dynamic testScreener(); + +dynamic testConsent(); + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() ] - [<abstract>IAuthRepository]o-[User] - [<abstract>IAuthRepository]o-[Session] - [<abstract>IAppDelegate]<:-[<abstract>IAuthRepository] + [EnrollmentFormViewModel]o-[Study] + [EnrollmentFormViewModel]o-[GoRouter] + [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] + [EnrollmentFormViewModel]o-[FormControl] + [EnrollmentFormViewModel]o-[FormArray] + [EnrollmentFormViewModel]o-[FormViewModelCollection] + [EnrollmentFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] + [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] + [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] - [AuthRepository + [EnrollmentFormConsentItemDelegate | - <static>+PERSIST_SESSION_KEY: String; - +supabaseClient: SupabaseClient; - +sharedPreferences: SharedPreferences; - +allowPasswordReset: bool; - +authClient: GoTrueClient; - +session: Session?; - +currentUser: User?; - +isLoggedIn: bool + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +owner: EnrollmentFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic | - -void _registerAuthListener(); - +dynamic signUp(); - +dynamic signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic updateUser(); - -dynamic _persistSession(); - -dynamic _resetPersistedSession(); - -dynamic _recoverSession(); - +void dispose(); - +dynamic onAppStart() + +void onCancel(); + +dynamic onSave(); + +ConsentItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() ] - [AuthRepository]o-[SupabaseClient] - [AuthRepository]o-[SharedPreferences] - [AuthRepository]o-[GoTrueClient] - [AuthRepository]o-[Session] - [AuthRepository]o-[User] - [<abstract>IAuthRepository]<:--[AuthRepository] + [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] + [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IInviteCodeRepository + [ConsentItemFormView | - +dynamic isCodeAlreadyUsed() + +formViewModel: ConsentItemFormViewModel ] - [<abstract>ModelRepository]<:--[<abstract>IInviteCodeRepository] + [ConsentItemFormView]o-[ConsentItemFormViewModel] - [InviteCodeRepository + [<abstract>WithScheduleControls | - +studyId: String; - +ref: ProviderRef<dynamic>; - +apiClient: StudyUApi; - +authRepository: IAuthRepository; - +studyRepository: IStudyRepository; - +study: Study + +isTimeRestrictedControl: FormControl<bool>; + +instanceID: FormControl<String>; + +restrictedTimeStartControl: FormControl<Time>; + +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; + +restrictedTimeEndControl: FormControl<Time>; + +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; + +hasReminderControl: FormControl<bool>; + +reminderTimeControl: FormControl<Time>; + +reminderTimePickerControl: FormControl<TimeOfDay>; + -_reminderControlStream: StreamSubscription<dynamic>?; + +scheduleFormControls: Map<String, FormControl<Object>>; + +hasReminder: bool; + +isTimeRestricted: bool; + +timeRestriction: List<Time>? | - +String getKey(); - +dynamic isCodeAlreadyUsed(); - +List<ModelAction<dynamic>> availableActions(); - +dynamic emitUpdate() + +void setScheduleControlsFrom(); + -dynamic _initReminderControl() ] - [InviteCodeRepository]o-[<abstract>ProviderRef] - [InviteCodeRepository]o-[<abstract>StudyUApi] - [InviteCodeRepository]o-[<abstract>IAuthRepository] - [InviteCodeRepository]o-[<abstract>IStudyRepository] - [InviteCodeRepository]o-[Study] - [<abstract>ModelRepository]<:-[InviteCodeRepository] - [<abstract>IInviteCodeRepository]<:--[InviteCodeRepository] + [<abstract>WithScheduleControls]o-[FormControl] + [<abstract>WithScheduleControls]o-[StreamSubscription] - [InviteCodeRepositoryDelegate + [<abstract>IFormDataWithSchedule | - +study: Study; - +apiClient: StudyUApi; - +studyRepository: IStudyRepository + +instanceId: String; + +isTimeLocked: bool; + +timeLockStart: StudyUTimeOfDay?; + +timeLockEnd: StudyUTimeOfDay?; + +hasReminder: bool; + +reminderTime: StudyUTimeOfDay? | - +dynamic fetch(); - +dynamic fetchAll(); - +dynamic save(); - +dynamic delete(); - +dynamic onError(); - +StudyInvite createDuplicate(); - +StudyInvite createNewInstance() + +Schedule toSchedule() ] - [InviteCodeRepositoryDelegate]o-[Study] - [InviteCodeRepositoryDelegate]o-[<abstract>StudyUApi] - [InviteCodeRepositoryDelegate]o-[<abstract>IStudyRepository] - [<abstract>IModelRepositoryDelegate]<:-[InviteCodeRepositoryDelegate] + [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] + [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] - [<abstract>SupabaseClientDependant + [ScheduleControls | - +supabaseClient: SupabaseClient + +formViewModel: WithScheduleControls + | + +Widget build(); + -List<FormTableRow> _conditionalTimeRestrictions() ] - [<abstract>SupabaseClientDependant]o-[SupabaseClient] + [ScheduleControls]o-[<abstract>WithScheduleControls] + [<abstract>FormConsumerWidget]<:-[ScheduleControls] - [SupabaseQueryError + [SurveyQuestionType | - +statusCode: String?; - +message: String; - +details: dynamic + +index: int; + <static>+values: List<SurveyQuestionType>; + <static>+choice: SurveyQuestionType; + <static>+bool: SurveyQuestionType; + <static>+scale: SurveyQuestionType ] - [Exception]<:--[SupabaseQueryError] - - [<abstract>SupabaseQueryMixin - | - +dynamic deleteAll(); - +dynamic getAll(); - +dynamic getById(); - +dynamic getByColumn(); - +List<T> deserializeList(); - +T deserializeObject() - ] + [SurveyQuestionType]o-[SurveyQuestionType] + [Enum]<:--[SurveyQuestionType] - [<abstract>GoRouteParamEnum + [ChoiceQuestionFormView | - +String toRouteParam(); - +String toShortString() - ] - - [RouterKeys + +formViewModel: QuestionFormViewModel | - <static>+studyKey: ValueKey<String>; - <static>+authKey: ValueKey<String> + +Widget build() ] - [RouterKeys]o-[ValueKey] - - [RouteParams - | - <static>+studiesFilter: String; - <static>+studyId: String; - <static>+measurementId: String; - <static>+interventionId: String; - <static>+testAppRoute: String - ] + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - [RouterConf + [BoolQuestionFormView | - <static>+router: GoRouter; - <static>+routes: List<GoRoute>; - <static>+publicRoutes: List<GoRoute>; - <static>+privateRoutes: List<GoRoute> + +formViewModel: QuestionFormViewModel | - <static>+GoRoute route() + +Widget build() ] - [RouterConf]o-[GoRouter] - - [<abstract>StudyFormRouteArgs - | - +studyId: String - ] + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - [<abstract>QuestionFormRouteArgs + [<abstract>IScaleQuestionFormViewModel | - +questionId: String - ] - - [<abstract>StudyFormRouteArgs]<:-[<abstract>QuestionFormRouteArgs] - - [ScreenerQuestionFormRouteArgs + +isMidValuesClearedInfoVisible: bool ] - [<abstract>QuestionFormRouteArgs]<:-[ScreenerQuestionFormRouteArgs] - - [ConsentItemFormRouteArgs + [ScaleQuestionFormView | - +consentId: String + +formViewModel: QuestionFormViewModel ] - [<abstract>StudyFormRouteArgs]<:-[ConsentItemFormRouteArgs] + [ScaleQuestionFormView]o-[QuestionFormViewModel] - [MeasurementFormRouteArgs + [<abstract>QuestionFormData | - +measurementId: String - ] - - [<abstract>StudyFormRouteArgs]<:-[MeasurementFormRouteArgs] - - [SurveyQuestionFormRouteArgs + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; + +questionId: String; + +questionText: String; + +questionInfoText: String?; + +questionType: SurveyQuestionType; + +responseOptionsValidity: Map<dynamic, bool>; + +responseOptions: List<dynamic>; + +id: String | - +questionId: String + +Question<dynamic> toQuestion(); + +EligibilityCriterion toEligibilityCriterion(); + +Answer<dynamic> constructAnswerFor(); + +dynamic setResponseOptionsValidityFrom(); + +QuestionFormData copy() ] - [MeasurementFormRouteArgs]<:-[SurveyQuestionFormRouteArgs] - [<abstract>QuestionFormRouteArgs]<:--[SurveyQuestionFormRouteArgs] + [<abstract>QuestionFormData]o-[SurveyQuestionType] + [<abstract>IFormData]<:--[<abstract>QuestionFormData] - [InterventionFormRouteArgs + [ChoiceQuestionFormData | - +interventionId: String - ] - - [<abstract>StudyFormRouteArgs]<:-[InterventionFormRouteArgs] - - [InterventionTaskFormRouteArgs + +isMultipleChoice: bool; + +answerOptions: List<String>; + +responseOptions: List<String> | - +taskId: String + +Question<dynamic> toQuestion(); + +QuestionFormData copy(); + -Choice _buildChoiceForValue(); + +Answer<dynamic> constructAnswerFor() ] - [InterventionFormRouteArgs]<:-[InterventionTaskFormRouteArgs] + [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] - [ReportItemFormRouteArgs + [BoolQuestionFormData | - +sectionId: String - ] - - [<abstract>StudyFormRouteArgs]<:-[ReportItemFormRouteArgs] - - [RoutingIntents + <static>+kResponseOptions: Map<String, bool>; + +responseOptions: List<String> | - <static>+root: RoutingIntent; - <static>+studies: RoutingIntent; - <static>+studiesShared: RoutingIntent; - <static>+publicRegistry: RoutingIntent; - <static>+study: RoutingIntent Function(String); - <static>+studyEdit: RoutingIntent Function(String); - <static>+studyEditInfo: RoutingIntent Function(String); - <static>+studyEditEnrollment: RoutingIntent Function(String); - <static>+studyEditInterventions: RoutingIntent Function(String); - <static>+studyEditIntervention: RoutingIntent Function(String, String); - <static>+studyEditMeasurements: RoutingIntent Function(String); - <static>+studyEditReports: RoutingIntent Function(String); - <static>+studyEditMeasurement: RoutingIntent Function(String, String); - <static>+studyTest: RoutingIntent Function(String, {String? appRoute}); - <static>+studyRecruit: RoutingIntent Function(String); - <static>+studyMonitor: RoutingIntent Function(String); - <static>+studyAnalyze: RoutingIntent Function(String); - <static>+studySettings: RoutingIntent Function(String); - <static>+accountSettings: RoutingIntent; - <static>+studyNew: RoutingIntent; - <static>+login: RoutingIntent; - <static>+signup: RoutingIntent; - <static>+passwordForgot: RoutingIntent; - <static>+passwordForgot2: RoutingIntent Function(String); - <static>+passwordRecovery: RoutingIntent; - <static>+error: RoutingIntent Function(Exception) + +Question<dynamic> toQuestion(); + +BoolQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [RoutingIntents]o-[RoutingIntent] - [RoutingIntents]o-[RoutingIntent Function(String)] - [RoutingIntents]o-[RoutingIntent Function(String, String)] - [RoutingIntents]o-[RoutingIntent Function(String, {String? appRoute})] - [RoutingIntents]o-[RoutingIntent Function(Exception)] + [<abstract>QuestionFormData]<:-[BoolQuestionFormData] - [RoutingIntent + [ScaleQuestionFormData | - +route: GoRoute; - +params: Map<String, String>; - +queryParams: Map<String, String>; - +dispatch: RoutingIntentDispatch?; - +extra: Object?; - +routeName: String; - +arguments: Map<String, String>; - +props: List<Object?> + +minValue: double; + +maxValue: double; + +minLabel: String?; + +maxLabel: String?; + +midValues: List<double?>; + +midLabels: List<String?>; + +stepSize: double; + +initialValue: double?; + +minColor: Color?; + +maxColor: Color?; + +responseOptions: List<double>; + +midAnnotations: List<Annotation> | - -dynamic _validateRoute(); - +bool matches() + +ScaleQuestion toQuestion(); + +QuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [RoutingIntent]o-[GoRoute] - [RoutingIntent]o-[RoutingIntentDispatch] - [<abstract>Equatable]<:-[RoutingIntent] + [ScaleQuestionFormData]o-[Color] + [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] - [RoutingIntentDispatch + [QuestionFormViewModel | - +index: int; - <static>+values: List<RoutingIntentDispatch>; - <static>+go: RoutingIntentDispatch; - <static>+push: RoutingIntentDispatch - ] - - [RoutingIntentDispatch]o-[RoutingIntentDispatch] - [Enum]<:--[RoutingIntentDispatch] - - [NullHelperDecoration + <static>+defaultQuestionType: SurveyQuestionType; + -_titles: Map<FormMode, String Function()>?; + +questionIdControl: FormControl<String>; + +questionTypeControl: FormControl<SurveyQuestionType>; + +questionTextControl: FormControl<String>; + +questionInfoTextControl: FormControl<String>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isMultipleChoiceControl: FormControl<bool>; + +choiceResponseOptionsArray: FormArray<dynamic>; + +customOptionsMin: int; + +customOptionsMax: int; + +customOptionsInitial: int; + +boolResponseOptionsArray: FormArray<String>; + <static>+kDefaultScaleMinValue: int; + <static>+kDefaultScaleMaxValue: int; + <static>+kNumMidValueControls: int; + <static>+kMidValueDebounceMilliseconds: int; + +scaleMinValueControl: FormControl<int>; + +scaleMaxValueControl: FormControl<int>; + -_scaleRangeControl: FormControl<int>; + +scaleMinLabelControl: FormControl<String>; + +scaleMaxLabelControl: FormControl<String>; + +scaleMidValueControls: FormArray<int>; + +scaleMidLabelControls: FormArray<String?>; + -_scaleResponseOptionsArray: FormArray<int>; + +scaleMinColorControl: FormControl<SerializableColor>; + +scaleMaxColorControl: FormControl<SerializableColor>; + +prevMidValues: List<int?>?; + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +form: FormGroup; + +questionId: String; + +questionType: SurveyQuestionType; + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; + +answerOptionsArray: FormArray<dynamic>; + +answerOptionsControls: List<AbstractControl<dynamic>>; + +validAnswerOptions: List<String>; + +boolOptions: List<AbstractControl<String>>; + +scaleMinValue: int; + +scaleMaxValue: int; + +scaleRange: int; + +scaleAllValueControls: List<AbstractControl<int>>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +questionTextRequired: dynamic; + +numValidChoiceOptions: dynamic; + +scaleRangeValid: dynamic; + +titles: Map<FormMode, String>; + +isAddOptionButtonVisible: bool; + +isMidValuesClearedInfoVisible: bool + | + +String? scaleMidLabelAt(); + -dynamic _onScaleRangeChanged(); + -dynamic _applyInputFormatters(); + -dynamic _updateScaleMidValueControls(); + -List<FormControlValidation> _getValidationConfig(); + +dynamic onQuestionTypeChanged(); + +dynamic onResponseOptionsChanged(); + -void _updateFormControls(); + +void initControls(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem(); + +QuestionFormViewModel createDuplicate() ] - [InputDecoration]<:-[NullHelperDecoration] + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - [MouseEventsRegion + [SurveyQuestionFormView | - +onTap: void Function()?; - +onHover: void Function(PointerHoverEvent)?; - +onEnter: void Function(PointerEnterEvent)?; - +onExit: void Function(PointerExitEvent)?; - +autoselectCursor: bool; - +cursor: SystemMouseCursor; - <static>+defaultCursor: SystemMouseCursor; - +autoCursor: SystemMouseCursor + +formViewModel: QuestionFormViewModel; + +isHtmlStyleable: bool ] - [MouseEventsRegion]o-[void Function()?] - [MouseEventsRegion]o-[void Function(PointerHoverEvent)?] - [MouseEventsRegion]o-[void Function(PointerEnterEvent)?] - [MouseEventsRegion]o-[void Function(PointerExitEvent)?] - [MouseEventsRegion]o-[SystemMouseCursor] + [SurveyQuestionFormView]o-[QuestionFormViewModel] - [ActionMenuInline + [<abstract>WithQuestionnaireControls | - +actions: List<ModelAction<dynamic>>; - +iconSize: double?; - +visible: bool; - +splashRadius: double?; - +paddingVertical: double?; - +paddingHorizontal: double? + +questionsArray: FormArray<dynamic>; + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; + +questionnaireControls: Map<String, FormArray<dynamic>>; + +propagateOnSave: bool; + +questionModels: List<Q>; + +questionTitles: Map<FormMode, String Function()> | - +Widget build() + +void setQuestionnaireControlsFrom(); + +QuestionnaireFormData buildQuestionnaireFormData(); + +void read(); + +void onCancel(); + +dynamic onSave(); + +Q provide(); + +Q provideQuestionFormViewModel() ] - [IconPack - | - <static>+defaultPack: List<IconOption>; - <static>+material: List<IconOption> - | - <static>+IconOption? resolveIconByName() - ] + [<abstract>WithQuestionnaireControls]o-[FormArray] + [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] + [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] + [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - [IconOption + [QuestionnaireFormData | - +name: String; - +icon: IconData?; - +isEmpty: bool; - +props: List<Object?> + +questionsData: List<QuestionFormData>?; + +id: String | - +String toJson(); - <static>+IconOption fromJson() + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() ] - [IconOption]o-[IconData] - [<abstract>Equatable]<:-[IconOption] + [<abstract>IFormData]<:--[QuestionnaireFormData] - [ReactiveIconPicker + [<abstract>StudyDesignPageWidget + | + +Widget? banner() ] - [ReactiveFocusableFormField]<:-[ReactiveIconPicker] + [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] - [IconPicker + [StudyFormViewModel | - +iconOptions: List<IconOption>; - +selectedOption: IconOption?; - +onSelect: void Function(IconOption)?; - +galleryIconSize: double?; - +selectedIconSize: double?; - +focusNode: FocusNode?; - +isDisabled: bool + +studyDirtyCopy: Study?; + +studyRepository: IStudyRepository; + +authRepository: IAuthRepository; + +router: GoRouter; + +studyInfoFormViewModel: StudyInfoFormViewModel; + +enrollmentFormViewModel: EnrollmentFormViewModel; + +measurementsFormViewModel: MeasurementsFormViewModel; + +reportsFormViewModel: ReportsFormViewModel; + +interventionsFormViewModel: InterventionsFormViewModel; + +form: FormGroup; + +isStudyReadonly: bool; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titles: Map<FormMode, String> | - +Widget build() + +void read(); + +void setControlsFrom(); + +Study buildFormData(); + +void dispose(); + +void onCancel(); + +dynamic onSave(); + -dynamic _applyAndSaveSubform() ] - [IconPicker]o-[IconOption] - [IconPicker]o-[void Function(IconOption)?] - [IconPicker]o-[FocusNode] + [StudyFormViewModel]o-[Study] + [StudyFormViewModel]o-[<abstract>IStudyRepository] + [StudyFormViewModel]o-[<abstract>IAuthRepository] + [StudyFormViewModel]o-[GoRouter] + [StudyFormViewModel]o-[StudyInfoFormViewModel] + [StudyFormViewModel]o-[EnrollmentFormViewModel] + [StudyFormViewModel]o-[MeasurementsFormViewModel] + [StudyFormViewModel]o-[ReportsFormViewModel] + [StudyFormViewModel]o-[InterventionsFormViewModel] + [StudyFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] - [IconPickerField + [<abstract>StudyScheduleControls | - +iconOptions: List<IconOption>; - +selectedOption: IconOption?; - +selectedIconSize: double?; - +galleryIconSize: double?; - +onSelect: void Function(IconOption)?; - +focusNode: FocusNode?; - +isDisabled: bool + <static>+defaultScheduleType: PhaseSequence; + <static>+defaultScheduleTypeSequence: String; + <static>+defaultNumCycles: int; + <static>+defaultPeriodLength: int; + +sequenceTypeControl: FormControl<PhaseSequence>; + +sequenceTypeCustomControl: FormControl<String>; + +phaseDurationControl: FormControl<int>; + +numCyclesControl: FormControl<int>; + +includeBaselineControl: FormControl<bool>; + +studyScheduleControls: Map<String, FormControl<Object>>; + <static>+kNumCyclesMin: int; + <static>+kNumCyclesMax: int; + <static>+kPhaseDurationMin: int; + <static>+kPhaseDurationMax: int; + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +numCyclesRange: dynamic; + +phaseDurationRange: dynamic; + +customSequenceRequired: dynamic | - +Widget build() + +void setStudyScheduleControlsFrom(); + +StudyScheduleFormData buildStudyScheduleFormData(); + +bool isSequencingCustom() ] - [IconPickerField]o-[IconOption] - [IconPickerField]o-[void Function(IconOption)?] - [IconPickerField]o-[FocusNode] + [<abstract>StudyScheduleControls]o-[PhaseSequence] + [<abstract>StudyScheduleControls]o-[FormControl] - [IconPickerGallery - | - +iconOptions: List<IconOption>; - +onSelect: void Function(IconOption)?; - +iconSize: double + [StudyDesignInterventionsFormView | +Widget build() ] - [IconPickerGallery]o-[void Function(IconOption)?] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] - [<abstract>IWithBanner + [InterventionFormViewModel | - +Widget? banner() - ] - - [BannerBox + +study: Study; + +interventionIdControl: FormControl<String>; + +interventionTitleControl: FormControl<String>; + +interventionIconControl: FormControl<IconOption>; + +interventionDescriptionControl: FormControl<String>; + +interventionTasksArray: FormArray<dynamic>; + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; + +form: FormGroup; + +interventionId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +atLeastOneTask: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> | - +prefixIcon: Widget?; - +body: Widget; - +style: BannerStyle; - +padding: EdgeInsets?; - +noPrefix: bool; - +dismissable: bool; - +isDismissed: bool?; - +onDismissed: dynamic Function()?; - +dismissIconSize: double + +void setControlsFrom(); + +InterventionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +void onCancel(); + +dynamic onSave(); + +InterventionTaskFormViewModel provide(); + +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); + +InterventionTaskFormRouteArgs buildFormRouteArgs(); + +InterventionFormViewModel createDuplicate() ] - [BannerBox]o-[<abstract>Widget] - [BannerBox]o-[BannerStyle] - [BannerBox]o-[EdgeInsets] - [BannerBox]o-[dynamic Function()?] + [InterventionFormViewModel]o-[Study] + [InterventionFormViewModel]o-[FormControl] + [InterventionFormViewModel]o-[FormArray] + [InterventionFormViewModel]o-[FormViewModelCollection] + [InterventionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] + [<abstract>IListActionProvider]<:--[InterventionFormViewModel] + [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] - [BannerStyle + [StudyScheduleFormView | - +index: int; - <static>+values: List<BannerStyle>; - <static>+warning: BannerStyle; - <static>+info: BannerStyle; - <static>+error: BannerStyle + +formViewModel: StudyScheduleControls + | + -FormTableRow _renderCustomSequence(); + +Widget build() ] - [BannerStyle]o-[BannerStyle] - [Enum]<:--[BannerStyle] + [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] + [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] - [Badge + [StudyScheduleFormData | - +icon: IconData?; - +color: Color?; - +borderRadius: double; - +label: String; - +type: BadgeType; - +padding: EdgeInsets; - +iconSize: double?; - +labelStyle: TextStyle? + +sequenceType: PhaseSequence; + +sequenceTypeCustom: String; + +numCycles: int; + +phaseDuration: int; + +includeBaseline: bool; + +id: String | - +Widget build(); - -Color? _getBackgroundColor(); - -Color _getBorderColor(); - -Color? _getLabelColor() + +StudySchedule toStudySchedule(); + +Study apply(); + +StudyScheduleFormData copy() ] - [Badge]o-[IconData] - [Badge]o-[Color] - [Badge]o-[BadgeType] - [Badge]o-[EdgeInsets] - [Badge]o-[TextStyle] + [StudyScheduleFormData]o-[PhaseSequence] + [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - [BadgeType + [InterventionFormView | - +index: int; - <static>+values: List<BadgeType>; - <static>+filled: BadgeType; - <static>+outlined: BadgeType; - <static>+outlineFill: BadgeType; - <static>+plain: BadgeType + +formViewModel: InterventionFormViewModel ] - [BadgeType]o-[BadgeType] - [Enum]<:--[BadgeType] + [InterventionFormView]o-[InterventionFormViewModel] - [ConstrainedWidthFlexible + [InterventionsFormViewModel | - +minWidth: double; - +maxWidth: double; - +flex: int; - +flexSum: int; - +child: Widget; - +outerConstraints: BoxConstraints + +study: Study; + +router: GoRouter; + +interventionsArray: FormArray<dynamic>; + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; + +form: FormGroup; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +interventionsRequired: dynamic; + +titles: Map<FormMode, String>; + +canTestStudySchedule: bool | - +Widget build(); - -double _getWidth() + +void setControlsFrom(); + +InterventionsFormData buildFormData(); + +void read(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +InterventionFormViewModel provide(); + +void onCancel(); + +dynamic onSave(); + +dynamic testStudySchedule() ] - [ConstrainedWidthFlexible]o-[<abstract>Widget] - [ConstrainedWidthFlexible]o-[BoxConstraints] + [InterventionsFormViewModel]o-[Study] + [InterventionsFormViewModel]o-[GoRouter] + [InterventionsFormViewModel]o-[FormArray] + [InterventionsFormViewModel]o-[FormViewModelCollection] + [InterventionsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InterventionsFormViewModel] + [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] + [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] - [SecondaryButton + [InterventionTaskFormData | - +text: String; - +icon: IconData?; - +isLoading: bool; - +onPressed: void Function()? + +taskId: String; + +taskTitle: String; + +taskDescription: String?; + <static>+kDefaultTitle: String; + +id: String | - +Widget build() + +CheckmarkTask toTask(); + +InterventionTaskFormData copy() ] - [SecondaryButton]o-[IconData] - [SecondaryButton]o-[void Function()?] + [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] - [HtmlStylingBanner + [InterventionPreview | - +isDismissed: bool; - +onDismissed: dynamic Function()? + +routeArgs: InterventionFormRouteArgs | +Widget build() ] - [HtmlStylingBanner]o-[dynamic Function()?] + [InterventionPreview]o-[InterventionFormRouteArgs] + [<abstract>ConsumerWidget]<:-[InterventionPreview] - [NavbarTab + [InterventionTaskFormView | - +title: String; - +intent: RoutingIntent?; - +index: int; - +enabled: bool + +formViewModel: InterventionTaskFormViewModel ] - [NavbarTab]o-[RoutingIntent] + [InterventionTaskFormView]o-[InterventionTaskFormViewModel] - [TabbedNavbar + [InterventionsFormData | - +tabs: List<T>; - +selectedTab: T?; - +indicator: BoxDecoration?; - +height: double?; - +disabledBackgroundColor: Color?; - +disabledTooltipText: String?; - +onSelect: void Function(int, T)?; - +labelPadding: EdgeInsets?; - +labelSpacing: double?; - +indicatorSize: TabBarIndicatorSize?; - +isScrollable: bool; - +backgroundColor: Color?; - +labelColorHover: Color?; - +unselectedLabelColorHover: Color? + +interventionsData: List<InterventionFormData>; + +studyScheduleData: StudyScheduleFormData; + +id: String + | + +Study apply(); + +InterventionsFormData copy() ] - [TabbedNavbar]o-[BoxDecoration] - [TabbedNavbar]o-[Color] - [TabbedNavbar]o-[void Function(int, T)?] - [TabbedNavbar]o-[EdgeInsets] - [TabbedNavbar]o-[TabBarIndicatorSize] + [InterventionsFormData]o-[StudyScheduleFormData] + [<abstract>IStudyFormData]<:--[InterventionsFormData] - [ActionMenuType + [InterventionTaskFormViewModel | - +index: int; - <static>+values: List<ActionMenuType>; - <static>+inline: ActionMenuType; - <static>+popup: ActionMenuType + +taskIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +taskTitleControl: FormControl<String>; + +taskDescriptionControl: FormControl<String>; + +markAsCompletedControl: FormControl<bool>; + +form: FormGroup; + +taskId: String; + +instanceId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +titles: Map<FormMode, String> + | + +void setControlsFrom(); + +InterventionTaskFormData buildFormData(); + +InterventionTaskFormViewModel createDuplicate() ] - [ActionMenuType]o-[ActionMenuType] - [Enum]<:--[ActionMenuType] + [InterventionTaskFormViewModel]o-[FormControl] + [InterventionTaskFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] + [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] - [FormScaffold + [InterventionFormData | - +formViewModel: T; - +actions: List<Widget>?; - +body: Widget; - +drawer: Widget?; - +actionsSpacing: double; - +actionsPadding: double + +interventionId: String; + +title: String; + +description: String?; + +tasksData: List<InterventionTaskFormData>?; + +iconName: String?; + <static>+kDefaultTitle: String; + +id: String + | + +Intervention toIntervention(); + +InterventionFormData copy() ] - [FormScaffold]o-[<abstract>Widget] + [<abstract>IFormData]<:-[InterventionFormData] - [<abstract>FormConsumerWidget + [AccountSettingsDialog | +Widget build() ] - [<abstract>FormConsumerRefWidget - | - +Widget build() - ] + [<abstract>ConsumerWidget]<:-[AccountSettingsDialog] - [PrimaryButton + [AppStatus | - +text: String; - +icon: IconData?; - +isLoading: bool; - +showLoadingEarliestAfterMs: int; - +onPressed: void Function()?; - +tooltip: String; - +tooltipDisabled: String; - +enabled: bool; - +onPressedFuture: dynamic Function()?; - +innerPadding: EdgeInsets; - +minimumSize: Size?; - +isDisabled: bool + +index: int; + <static>+values: List<AppStatus>; + <static>+initializing: AppStatus; + <static>+initialized: AppStatus ] - [PrimaryButton]o-[IconData] - [PrimaryButton]o-[void Function()?] - [PrimaryButton]o-[dynamic Function()?] - [PrimaryButton]o-[EdgeInsets] - [PrimaryButton]o-[Size] + [AppStatus]o-[AppStatus] + [Enum]<:--[AppStatus] - [SingleColumnLayout - | - <static>+defaultConstraints: BoxConstraints; - <static>+defaultConstraintsNarrow: BoxConstraints; - +body: Widget; - +header: Widget?; - +stickyHeader: bool; - +constraints: BoxConstraints?; - +scroll: bool; - +padding: EdgeInsets? + [<abstract>IAppDelegate | - <static>+dynamic fromType() + +dynamic onAppStart() ] - [SingleColumnLayout]o-[BoxConstraints] - [SingleColumnLayout]o-[<abstract>Widget] - [SingleColumnLayout]o-[EdgeInsets] - - [SingleColumnLayoutType + [AppController | - +index: int; - <static>+values: List<SingleColumnLayoutType>; - <static>+boundedWide: SingleColumnLayoutType; - <static>+boundedNarrow: SingleColumnLayoutType; - <static>+stretched: SingleColumnLayoutType; - <static>+split: SingleColumnLayoutType + +sharedPreferences: SharedPreferences; + +appDelegates: List<IAppDelegate>; + -_delayedFuture: dynamic; + +isInitialized: dynamic + | + +dynamic onAppStart(); + -dynamic _callDelegates() ] - [SingleColumnLayoutType]o-[SingleColumnLayoutType] - [Enum]<:--[SingleColumnLayoutType] + [AppController]o-[SharedPreferences] - [FormTableRow + [CombinedStreamNotifier | - +label: String?; - +labelBuilder: Widget Function(BuildContext)?; - +labelStyle: TextStyle?; - +labelHelpText: String?; - +input: Widget; - +control: AbstractControl<dynamic>?; - +layout: FormTableRowLayout? + -_subscriptions: List<StreamSubscription<dynamic>> + | + +void dispose() ] - [FormTableRow]o-[Widget Function(BuildContext)?] - [FormTableRow]o-[TextStyle] - [FormTableRow]o-[<abstract>Widget] - [FormTableRow]o-[<abstract>AbstractControl] - [FormTableRow]o-[FormTableRowLayout] + [ChangeNotifier]<:-[CombinedStreamNotifier] - [FormTableLayout + [Tuple | - +rows: List<FormTableRow>; - +columnWidths: Map<int, TableColumnWidth>; - +rowDivider: Widget?; - +rowLayout: FormTableRowLayout?; - +rowLabelStyle: TextStyle? + +first: T1; + +second: T2; + +props: List<Object?> | - +Widget build() + +Map<String, dynamic> toJson(); + <static>+Tuple<dynamic, dynamic> fromJson(); + +Tuple<T1, T2> copy(); + +Tuple<T1, T2> copyWith() ] - [FormTableLayout]o-[<abstract>Widget] - [FormTableLayout]o-[FormTableRowLayout] - [FormTableLayout]o-[TextStyle] + [<abstract>Equatable]<:-[Tuple] - [FormSectionHeader + [OptimisticUpdate | - +title: String; - +titleTextStyle: TextStyle?; - +helpText: String?; - +divider: bool; - +helpTextDisabled: bool + +applyOptimistic: void Function(); + +apply: dynamic Function(); + +rollback: void Function(); + +onUpdate: void Function()?; + +onError: void Function(Object, StackTrace?)?; + +rethrowErrors: bool; + +runOptimistically: bool; + +completeFutureOptimistically: bool | - +Widget build() + +dynamic execute(); + -void _runUpdateHandlerIfAny() ] - [FormSectionHeader]o-[TextStyle] + [OptimisticUpdate]o-[void Function()] + [OptimisticUpdate]o-[dynamic Function()] + [OptimisticUpdate]o-[void Function()?] + [OptimisticUpdate]o-[void Function(Object, StackTrace?)?] - [FormLabel + [<abstract>ExecutionLimiter | - +labelText: String?; - +helpText: String?; - +labelTextStyle: TextStyle?; - +layout: FormTableRowLayout? + +milliseconds: int; + <static>-_timer: Timer? | - +Widget build() + +void dispose() ] - [FormLabel]o-[TextStyle] - [FormLabel]o-[FormTableRowLayout] + [<abstract>ExecutionLimiter]o-[Timer] - [FormTableRowLayout + [Debouncer | - +index: int; - <static>+values: List<FormTableRowLayout>; - <static>+vertical: FormTableRowLayout; - <static>+horizontal: FormTableRowLayout + +leading: bool; + +cancelUncompleted: bool; + -_uncompletedFutureOperation: CancelableOperation<dynamic>? + | + +dynamic call() ] - [FormTableRowLayout]o-[FormTableRowLayout] - [Enum]<:--[FormTableRowLayout] + [Debouncer]o-[CancelableOperation] + [<abstract>ExecutionLimiter]<:-[Debouncer] - [FormSideSheetTab + [Throttler | - +formViewBuilder: Widget Function(T) + +dynamic call() ] - [FormSideSheetTab]o-[Widget Function(T)] - [NavbarTab]<:-[FormSideSheetTab] + [<abstract>ExecutionLimiter]<:-[Throttler] - [SidesheetTab + [<abstract>FileFormatEncoder | - +builder: Widget Function(BuildContext) + +dynamic encodeAsync(); + +String encode(); + +dynamic call() ] - [SidesheetTab]o-[Widget Function(BuildContext)] - [NavbarTab]<:-[SidesheetTab] - - [Sidesheet + [CSVStringEncoder | - <static>+kDefaultWidth: double; - +titleText: String; - +body: Widget?; - +tabs: List<SidesheetTab>?; - +actionButtons: List<Widget>?; - +width: double?; - +withCloseButton: bool; - +ignoreAppBar: bool; - +collapseSingleTab: bool; - +bodyPadding: EdgeInsets?; - +wrapContent: Widget Function(Widget)? + +String encode() ] - [Sidesheet]o-[<abstract>Widget] - [Sidesheet]o-[EdgeInsets] - [Sidesheet]o-[Widget Function(Widget)?] + [<abstract>FileFormatEncoder]<:-[CSVStringEncoder] - [UnderConstruction + [JsonStringEncoder | - +Widget build() + +String encode() ] - [DismissButton + [<abstract>FileFormatEncoder]<:-[JsonStringEncoder] + + [CountWhereValidator | - +onPressed: void Function()?; - +text: String? + +predicate: bool Function(T?); + +minCount: int?; + +maxCount: int?; + <static>+kValidationMessageMinCount: String; + <static>+kValidationMessageMaxCount: String | - +Widget build() + +Map<String, dynamic>? validate() ] - [DismissButton]o-[void Function()?] + [CountWhereValidator]o-[bool Function(T?)] + [<abstract>Validator]<:-[CountWhereValidator] - [TwoColumnLayout + [MustMatchValidator | - <static>+defaultDivider: VerticalDivider; - <static>+defaultContentPadding: EdgeInsets; - <static>+slimContentPadding: EdgeInsets; - +leftWidget: Widget; - +rightWidget: Widget; - +dividerWidget: Widget?; - +headerWidget: Widget?; - +flexLeft: int?; - +flexRight: int?; - +constraintsLeft: BoxConstraints?; - +constraintsRight: BoxConstraints?; - +scrollLeft: bool; - +scrollRight: bool; - +paddingLeft: EdgeInsets?; - +paddingRight: EdgeInsets?; - +backgroundColorLeft: Color?; - +backgroundColorRight: Color?; - +stretchHeight: bool + +control: AbstractControl<dynamic>?; + +matchingControl: AbstractControl<dynamic>? + | + +Map<String, dynamic>? validate() ] - [TwoColumnLayout]o-[VerticalDivider] - [TwoColumnLayout]o-[EdgeInsets] - [TwoColumnLayout]o-[<abstract>Widget] - [TwoColumnLayout]o-[BoxConstraints] - [TwoColumnLayout]o-[Color] + [MustMatchValidator]o-[<abstract>AbstractControl] + [<abstract>Validator]<:-[MustMatchValidator] - [ErrorPage - | - +error: Exception? + [FieldValidators | - +Widget build() + <static>+String? emailValidator() ] - [<abstract>ConsumerWidget]<:-[ErrorPage] + [Patterns + | + <static>+timeFormatString: String; + <static>+emailFormatString: String; + <static>+url: String + ] - [SplashPage + [Time | - +Widget build() + <static>+dynamic fromTimeOfDay(); + +Map<String, dynamic> toJson(); + <static>+Time fromJson() ] - [Hyperlink + [TimeOfDay]<:-[Time] + + [TimeValueAccessor | - +text: String; - +url: String?; - +onClick: void Function()?; - +linkColor: Color; - +hoverColor: Color?; - +visitedColor: Color?; - +style: TextStyle?; - +hoverStyle: TextStyle?; - +visitedStyle: TextStyle?; - +icon: IconData?; - +iconSize: double? + +String modelToViewValue(); + +Time? viewToModelValue(); + -String _addLeadingZeroIfNeeded() ] - [Hyperlink]o-[void Function()?] - [Hyperlink]o-[Color] - [Hyperlink]o-[TextStyle] - [Hyperlink]o-[IconData] + [<abstract>ControlValueAccessor]<:-[TimeValueAccessor] - [StandardDialog + [NumericalRangeFormatter | - +title: Widget?; - +titleText: String?; - +body: Widget; - +actionButtons: List<Widget>; - +backgroundColor: Color?; - +borderRadius: double?; - +width: double?; - +height: double?; - +minWidth: double; - +minHeight: double; - +maxWidth: double?; - +maxHeight: double?; - +padding: EdgeInsets + +min: int?; + +max: int? | - +Widget build() + +TextEditingValue formatEditUpdate() ] - [StandardDialog]o-[<abstract>Widget] - [StandardDialog]o-[Color] - [StandardDialog]o-[EdgeInsets] + [<abstract>TextInputFormatter]<:-[NumericalRangeFormatter] - [StudyULogo - | - +onTap: void Function()? + [StudySequenceFormatter | - +Widget build() + +TextEditingValue formatEditUpdate() ] - [StudyULogo]o-[void Function()?] + [<abstract>TextInputFormatter]<:-[StudySequenceFormatter] - [HelpIcon + [<abstract>IProviderArgsResolver | - +tooltipText: String? + +R provide() + ] + + [<abstract>JsonFileLoader | - +Widget build() + +jsonAssetsPath: String + | + +dynamic loadJson(); + +dynamic parseJsonMapFromAssets(); + +dynamic parseJsonListFromAssets() ] - [EmptyBody + [ModelAction | + +type: T; + +label: String; +icon: IconData?; - +leading: Widget?; - +leadingSpacing: double?; - +title: String?; - +description: String?; - +button: Widget? - | - +Widget build() + +onExecute: Function; + +isAvailable: bool; + +isDestructive: bool ] - [EmptyBody]o-[IconData] - [EmptyBody]o-[<abstract>Widget] + [ModelAction]o-[IconData] - [ReactiveCustomColorPicker + [<abstract>IModelActionProvider + | + +List<ModelAction<dynamic>> availableActions() ] - [ReactiveFormField]<:-[ReactiveCustomColorPicker] - - [TextParagraph + [<abstract>IListActionProvider | - +text: String?; - +style: TextStyle?; - +selectable: bool; - +span: List<TextSpan>? + +void onSelectItem(); + +void onNewItem() + ] + + [<abstract>IModelActionProvider]<:-[<abstract>IListActionProvider] + + [ModelActionType | - +Widget build() + +index: int; + <static>+values: List<ModelActionType>; + <static>+edit: ModelActionType; + <static>+delete: ModelActionType; + <static>+remove: ModelActionType; + <static>+duplicate: ModelActionType; + <static>+clipboard: ModelActionType; + <static>+primary: ModelActionType ] - [TextParagraph]o-[TextStyle] + [ModelActionType]o-[ModelActionType] + [Enum]<:--[ModelActionType] - [FormControlLabel + [SuppressedBehaviorSubject | - +formControl: AbstractControl<dynamic>; - +text: String; - +isClickable: bool; - +textStyle: TextStyle?; - +onClick: void Function(AbstractControl<dynamic>)? + +subject: BehaviorSubject<T>; + +didSuppressInitialEvent: bool; + -_controller: StreamController<T> | - +Widget build() + -StreamController<T> _buildDerivedController(); + +dynamic close() ] - [FormControlLabel]o-[<abstract>AbstractControl] - [FormControlLabel]o-[TextStyle] - [FormControlLabel]o-[void Function(AbstractControl<dynamic>)?] + [SuppressedBehaviorSubject]o-[BehaviorSubject] + [SuppressedBehaviorSubject]o-[StreamController] - [StandardTableColumn + [SerializableColor | - +label: String; - +tooltip: String?; - +columnWidth: TableColumnWidth + +Map<String, dynamic> toJson(); + <static>+SerializableColor fromJson() ] - [StandardTableColumn]o-[<abstract>TableColumnWidth] + [Color]<:-[SerializableColor] - [StandardTable + [StudyUException | - +items: List<T>; - +columns: List<StandardTableColumn>; - +onSelectItem: void Function(T); - +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)?; - +trailingActionsMenuType: ActionMenuType?; - +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; - +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; - +trailingActionsColumn: StandardTableColumn; - +tableWrapper: Widget Function(Widget)?; - +cellSpacing: double; - +rowSpacing: double; - +minRowHeight: double?; - +showTableHeader: bool; - +hideLeadingTrailingWhenEmpty: bool; - +leadingWidget: Widget?; - +trailingWidget: Widget?; - +leadingWidgetSpacing: double?; - +trailingWidgetSpacing: double?; - +emptyWidget: Widget?; - +rowStyle: StandardTableStyle; - +disableRowInteractions: bool + +message: String + | + +String toString() ] - [StandardTable]o-[void Function(T)] - [StandardTable]o-[List<ModelAction<dynamic>> Function(T, int)?] - [StandardTable]o-[ActionMenuType] - [StandardTable]o-[TableRow Function(BuildContext, List<StandardTableColumn>)?] - [StandardTable]o-[StandardTableColumn] - [StandardTable]o-[Widget Function(Widget)?] - [StandardTable]o-[<abstract>Widget] - [StandardTable]o-[StandardTableStyle] + [Exception]<:--[StudyUException] - [StandardTableStyle + [DropdownMenuItemTheme | - +index: int; - <static>+values: List<StandardTableStyle>; - <static>+plain: StandardTableStyle; - <static>+material: StandardTableStyle + +iconTheme: IconThemeData? ] - [StandardTableStyle]o-[StandardTableStyle] - [Enum]<:--[StandardTableStyle] + [DropdownMenuItemTheme]o-[IconThemeData] + [<abstract>Diagnosticable]<:-[DropdownMenuItemTheme] - [Collapsible + [ThemeConfig | - +contentBuilder: Widget Function(BuildContext, bool); - +headerBuilder: Widget Function(BuildContext, bool)?; - +title: String?; - +isCollapsed: bool + <static>+kMinContentWidth: double; + <static>+kMaxContentWidth: double; + <static>+kHoverFadeFactor: double; + <static>+kMuteFadeFactor: double + | + <static>+dynamic bodyBackgroundColor(); + <static>+Color modalBarrierColor(); + <static>+Color containerColor(); + <static>+Color colorPickerInitialColor(); + <static>+TextStyle bodyTextMuted(); + <static>+TextStyle bodyTextBackground(); + <static>+double iconSplashRadius(); + <static>+Color sidesheetBackgroundColor(); + <static>+InputDecorationTheme dropdownInputDecorationTheme(); + <static>+DropdownMenuItemTheme dropdownMenuItemTheme() ] - [Collapsible]o-[Widget Function(BuildContext, bool)] - [Collapsible]o-[Widget Function(BuildContext, bool)?] + [NoAnimationPageTransitionsBuilder + | + +Widget buildTransitions() + ] - [<abstract>ISyncIndicatorViewModel + [<abstract>PageTransitionsBuilder]<:-[NoAnimationPageTransitionsBuilder] + + [WebTransitionBuilder | - +isDirty: bool; - +lastSynced: DateTime? + +Widget buildTransitions() ] - [SyncIndicator + [<abstract>PageTransitionsBuilder]<:-[WebTransitionBuilder] + + [ThemeSettingChange | - +state: AsyncValue<T>; - +lastSynced: DateTime?; - +isDirty: bool; - +animationDuration: int; - +iconSize: double + +settings: ThemeSettings ] - [SyncIndicator]o-[<abstract>AsyncValue] + [ThemeSettingChange]o-[ThemeSettings] + [<abstract>Notification]<:-[ThemeSettingChange] - [ActionPopUpMenuButton + [ThemeProvider | - +actions: List<ModelAction<dynamic>>; - +triggerIconColor: Color?; - +triggerIconColorHover: Color?; - +triggerIconSize: double; - +disableSplashEffect: bool; - +hideOnEmpty: bool; - +orientation: Axis; - +elevation: double?; - +splashRadius: double?; - +enabled: bool; - +position: PopupMenuPosition + +settings: ValueNotifier<ThemeSettings>; + +lightDynamic: ColorScheme?; + +darkDynamic: ColorScheme?; + +pageTransitionsTheme: PageTransitionsTheme; + +shapeMedium: ShapeBorder | - +Widget build(); - -Widget _buildPopupMenu() + +Color custom(); + +Color blend(); + +Color source(); + +ColorScheme colors(); + +CardTheme cardTheme(); + +ListTileThemeData listTileTheme(); + +AppBarTheme appBarTheme(); + +SnackBarThemeData snackBarThemeData(); + +TabBarTheme tabBarTheme(); + +BottomAppBarTheme bottomAppBarTheme(); + +BottomNavigationBarThemeData bottomNavigationBarTheme(); + +SwitchThemeData switchTheme(); + +InputDecorationTheme inputDecorationTheme(); + +TextTheme textTheme(); + +DividerThemeData dividerTheme(); + +NavigationRailThemeData navigationRailTheme(); + +DrawerThemeData drawerTheme(); + +IconThemeData iconTheme(); + +CheckboxThemeData checkboxTheme(); + +RadioThemeData radioTheme(); + +TooltipThemeData tooltipTheme(); + +ThemeData light(); + +ThemeData dark(); + +ThemeMode themeMode(); + +ThemeData theme(); + <static>+ThemeProvider of(); + +bool updateShouldNotify() ] - [ActionPopUpMenuButton]o-[Color] - [ActionPopUpMenuButton]o-[Axis] - [ActionPopUpMenuButton]o-[PopupMenuPosition] + [ThemeProvider]o-[ValueNotifier] + [ThemeProvider]o-[ColorScheme] + [ThemeProvider]o-[PageTransitionsTheme] + [ThemeProvider]o-[<abstract>ShapeBorder] + [<abstract>InheritedWidget]<:-[ThemeProvider] - [AsyncValueWidget + [ThemeSettings | - +value: AsyncValue<T>; - +data: Widget Function(T); - +error: Widget Function(Object, StackTrace?)?; - +loading: Widget Function()?; - +empty: Widget Function()? + +sourceColor: Color; + +themeMode: ThemeMode + ] + + [ThemeSettings]o-[Color] + [ThemeSettings]o-[ThemeMode] + + [CustomColor | - +Widget build(); - -Widget _buildDataOrEmptyWidget(); - -Widget _defaultError(); - -Widget _defaultLoad() + +name: String; + +color: Color; + +blend: bool + | + +Color value() ] - [AsyncValueWidget]o-[<abstract>AsyncValue] - [AsyncValueWidget]o-[Widget Function(T)] - [AsyncValueWidget]o-[Widget Function(Object, StackTrace?)?] - [AsyncValueWidget]o-[Widget Function()?] + [CustomColor]o-[Color] - + - + - + - + - - - + + + - + + + + + + + + + + + + + + - - + - + + + - + + + + + + - - + - + - + + + - + - + - + - + - + - + - + - + - + + + + - + + - + + + + - - - - - + + + + - + + + + + + + + + - + - - + + - + - - - - - - - + - + - - - + + + + + + + + + + + - + + + + + + + + - + + - + - + - + - + - + - - - + - + - + - + + + + + + - + + - + - + - + - + - + - + + + - + - + - + - - + + + + + + + + + + + + + + + + + + + + + - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + - + - - - + - + - - - - - - - - - + - + - - - + - + + + + + - + - + - + - - + + - + + + + + + + + + + + + + + + + + + - + + + + + + + + - + - - - - - - - - - + - + - + - + - + - + - + - + - - - + - + - + - + - - - - - - - + + + - + - - - + - - + + - + - - - + + - + + + + + + - + - + - + - + + + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - + - - - + + + + + + + - - + - + - - - + - + - + - + - + - + - + - + - + - + - - + + + - - + + + - + - - + + + - - + - + - + - + - + - + + + + - + + - + - + - + - - - + - + - + - + - + - + - + - + - - - + - + - - - + - + - - - + - + - - - + - + - + - + - + + + + + - + - + - + - + - + - + - + - + - + - + - - + + - + - - + + + - - + - + - + - + - + - + - + - + - - - - - + - + - + - + + + + + - - - + - - + + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - + - - + - + - + - + - + - + - - - - - - - + - + - + - + - - - + - + - - - + - - - - - - + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - + + + - - - + + + - - + - + - + - + - - + + + - - + - - - + + + + - - - - + - + - - + + + - - + - + - + - + - - - - - + - + - + - + - - + + + - - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - + + + - - - + + + - - - + + + - - - - + - + - - - + - + - + - + - + - + - + - + - + - + - - - + - - - + + + + + + + + + + + + - - + - - + + - + - + - + - - - - - + - + - - - - + + + - - + + + + + - + - + - + - + - - - - + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - - - - - - - - - - + - - - - - - - - + + + - + - - - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - + - - + - + - - - + - - - + + + + - - - - + - + - + - + - - - + - + - + - + - + - + - - - - - - + - - - + + - + - + + + - + - + - + - + - + - - + + - - - - - - + + - + - - - - - - + + - + - - - + + + - + - + - - - - + - - + - + - - - + - + - - - + - + - + - - + + - - - - - + - + - + + + - + - - - - + + - + - + - + - + - + - + - + - + - + - + - - - - - - + - - - - - - + - + - + - + - - + + + - - - + + + - - - + + + - - + - + - + - + - + - + - + - + - + + + - + - + + + + + - + - + - + + + - + - - - - + + - + - + - + - + - + - - - + - + - - - + - + - - - + - + - + - + - + - + - - - - - - - + + + - - - - + - - + + + - + - + + + - + - + - + - - + + + - - - - - - - - - - - - + - + - + - + - + - + - + - + + + + - + + - + - + + + + + - + - + - + - + - + - - - - + + + + + + + + + + + + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - - - + + + + - + + - + - + - + - + - + - + - + - - - - - + - + - + - + - + + + + + - + - + - + - - - - - - - - - - - + - + - - - + + + + + - + - + - + - + - + - - + + + - - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + + + + + - + - - + + + - - - - - - - - - - + - + - + + + - + - + - - - + - - - - - - + - + + - + - + - + - - + + - + - - + + + + - + - + - + - - - - - - - - - - - + - + - - + + + - - + - + + + + + + + - + - + - + - + - + - - + + - + - + - + + + + + + + + + + + + + + - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - + - - + + - + - + + + - + - - - + + + - + + + + - + + - + - + - + - + - + - + - + - - + + + + + + + - + + - + - - - - + + + - + + - + - + - + - - - + + - - - + + + - - + - + - - + + - + - + - + - + - + - - - + + + + + - - - - + - - + - + - + - + - - - - - - - - - - - - + + + - - - - - - - - + - + - + - + - + - + + + + - + + - + - + + + - + - + - + - + - + - - - + + + - + + + - + - - - - + + - + - - - + + - + + + + - + - + - + - + + + + + - + - + - + - - - - - - - + + - + + - + - + - + - + + + - + - + + + - + + + + + + - + + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + - + - - - - + + + - - - + + + - + + - + - + - + - - - + + - - - + + + + - + - - + + - + - + - + - + - + - + - + - - - + + - + + - + - + + + - + - - - + + - + + - + - + + + - + - + + + - + - + - + - - - - - - + - + + + + + + - + - + + + - + - + - + - + - + - + - + - - - + + + + - + + - + - + - + - + - + - + - - - - + + + - - - + + + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - - + + - + - - - + - + - - - + + + - + - + - + - + - + - + - + - + - + - - - + + + + + + + + + + + + - + + - + - + + + - + + + + - + + - + - - - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + - + + + + - + - + + + - + - + - + + + + - + + - + - + - + - - - + + + + + + + + + - + + + + - + + - + - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + - + - + + + - + - + + + + + + + + + + + - + - + + + - + + + + - + + - + - + - + + + - + - - + + - + - + + + + + + + - + - + + + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - + + + + + + + + Assets + + + + + + <static>+logoWide: String + + + - - - - + + + + - - - NotificationDispatcher + + + Config - - - +child: Widget? - +snackbarInnerPadding: double - +snackbarWidth: double? - +snackbarBehavior: SnackBarBehavior - +snackbarDefaultDuration: int + + + <static>+isDebugMode: bool + <static>+defaultLocale: Set<String> + <static>+supportedLocales: Map<String, String> + <static>+newStudyId: String + <static>+newModelId: String + <static>+minSplashTime: int + <static>+formAutosaveDebounce: int - - - + + + + - - - Widget + + + IAppRepository + + + + + + +dynamic fetchAppConfig() + +void dispose() - - - + + + + + - - - SnackBarBehavior + + + AppRepository + + + + + + +apiClient: StudyUApi + + + + + + +dynamic fetchAppConfig() + +void dispose() - - - - + + + + - - - IClipboardService + + + StudyUApi - - - +dynamic copy() + + + +dynamic saveStudy() + +dynamic fetchStudy() + +dynamic getUserStudies() + +dynamic deleteStudy() + +dynamic saveStudyInvite() + +dynamic fetchStudyInvite() + +dynamic deleteStudyInvite() + +dynamic deleteParticipants() + +dynamic fetchAppConfig() + +dynamic fetchUser() + +dynamic saveUser() - - - - + + + + - - - ClipboardService + + + IStudyRepository - - - +dynamic copy() + + + +dynamic launch() + +dynamic deleteParticipants() - - - - + + + + + - - - INotificationService + + + ModelRepository - - - +void showMessage() - +void show() - +Stream<NotificationIntent> watchNotifications() - +void dispose() + + + +delegate: IModelRepositoryDelegate<T> + -_allModelsStreamController: BehaviorSubject<List<WrappedModel<T>>> + -_allModelEventsStreamController: BehaviorSubject<ModelEvent<T>> + +modelStreamControllers: Map<String, BehaviorSubject<WrappedModel<T>>> + +modelEventsStreamControllers: Map<String, BehaviorSubject<ModelEvent<T>>> + -_allModels: Map<String, WrappedModel<T>> + + + + + + +WrappedModel<T>? get() + +dynamic fetchAll() + +dynamic fetch() + +dynamic save() + +dynamic delete() + +dynamic duplicateAndSave() + +dynamic duplicateAndSaveFromRemote() + +Stream<List<WrappedModel<T>>> watchAll() + +Stream<WrappedModel<T>> watch() + +Stream<ModelEvent<T>> watchAllChanges() + +Stream<ModelEvent<T>> watchChanges() + -dynamic _buildModelSpecificController() + +dynamic ensurePersisted() + +WrappedModel<T> upsertLocally() + +List<WrappedModel<T>> upsertAllLocally() + +dynamic emitUpdate() + +dynamic emitModelEvent() + +dynamic emitError() + +void dispose() + +List<ModelAction<dynamic>> availableActions() - - - - - + + + + + - - - NotificationService + + + StudyRepository - - - -_streamController: BehaviorSubject<NotificationIntent> + + + +apiClient: StudyUApi + +authRepository: IAuthRepository + +ref: ProviderRef<dynamic> + +sortCallback: void Function()? - - - +Stream<NotificationIntent> watchNotifications() - +void showMessage() - +void show() - +void dispose() + + + +String getKey() + +dynamic deleteParticipants() + +dynamic launch() + +List<ModelAction<dynamic>> availableActions() - - - + + + + + - - - BehaviorSubject + + + IAuthRepository - - - - - - - - - Notifications + + + +allowPasswordReset: bool + +currentUser: User? + +isLoggedIn: bool + +session: Session? - - - <static>+passwordReset: SnackbarIntent - <static>+passwordResetSuccess: SnackbarIntent - <static>+studyDeleted: SnackbarIntent - <static>+inviteCodeDeleted: SnackbarIntent - <static>+inviteCodeClipped: SnackbarIntent - <static>+studyDeleteConfirmation: AlertIntent + + + +dynamic signUp() + +dynamic signInWith() + +dynamic signOut() + +dynamic resetPasswordForEmail() + +dynamic updateUser() + +void dispose() - - - - - - - - SnackbarIntent - - + + + - - - +duration: int? + + + ProviderRef - - - - + + + - - - AlertIntent + + + void Function()? - - - +title: String - +dismissOnAction: bool - +isDestructive: dynamic + + + + + + + + + + StudyRepositoryDelegate - - - - - - - - - NotificationDefaultActions + + + +apiClient: StudyUApi + +authRepository: IAuthRepository - - - <static>+cancel: NotificationAction + + + +dynamic fetchAll() + +dynamic fetch() + +dynamic save() + +dynamic delete() + +dynamic onError() + +Study createNewInstance() + +Study createDuplicate() - - - - + + + + - - - NotificationAction + + + IModelRepositoryDelegate - - - +label: String - +onSelect: dynamic Function() - +isDestructive: bool + + + +dynamic fetchAll() + +dynamic fetch() + +dynamic save() + +dynamic delete() + +T createNewInstance() + +T createDuplicate() + +dynamic onError() - - - - - + + + + + - - - NotificationIntent + + + IUserRepository - - - +message: String? - +customContent: Widget? - +icon: IconData? - +actions: List<NotificationAction>? - +type: NotificationType + + + +user: StudyUUser - - - +void register() + + + +dynamic fetchUser() + +dynamic saveUser() + +dynamic updatePreferences() - - - + + + - - - IconData + + + StudyUUser - - - - + + + + + - - - NotificationType + + + UserRepository - - - +index: int - <static>+values: List<NotificationType> - <static>+snackbar: NotificationType - <static>+alert: NotificationType - <static>+custom: NotificationType + + + +apiClient: StudyUApi + +authRepository: IAuthRepository + +ref: Ref<Object?> + +user: StudyUUser - - - - - - - - dynamic Function() + + + +dynamic fetchUser() + +dynamic saveUser() + +dynamic updatePreferences() - - - + + + - - - Enum + + + Ref - - - - + + + + - - - DropdownMenuItemTheme - - - - - - +iconTheme: IconThemeData? + + + PreferenceAction - - - - - - - - IconThemeData + + + +index: int + <static>+values: List<PreferenceAction> + <static>+pin: PreferenceAction + <static>+pinOff: PreferenceAction - - - + + + - - - Diagnosticable + + + Enum - - - - - - - - - ThemeConfig - - - - - - <static>+kMinContentWidth: double - <static>+kMaxContentWidth: double - <static>+kHoverFadeFactor: double - <static>+kMuteFadeFactor: double - - + + + - - - <static>+dynamic bodyBackgroundColor() - <static>+Color modalBarrierColor() - <static>+Color containerColor() - <static>+Color colorPickerInitialColor() - <static>+TextStyle bodyTextMuted() - <static>+TextStyle bodyTextBackground() - <static>+double iconSplashRadius() - <static>+Color sidesheetBackgroundColor() - <static>+InputDecorationTheme dropdownInputDecorationTheme() - <static>+DropdownMenuItemTheme dropdownMenuItemTheme() + + + StudyLaunched - - - - + + + + - - - NoAnimationPageTransitionsBuilder + + + ModelEvent - - - +Widget buildTransitions() + + + +modelId: String + +model: T - - - + + + + + - - - PageTransitionsBuilder + + + WrappedModel - - - - - - - - - WebTransitionBuilder + + + -_model: T + +asyncValue: AsyncValue<T> + +isLocalOnly: bool + +isDirty: bool + +isDeleted: bool + +lastSaved: DateTime? + +lastFetched: DateTime? + +lastUpdated: DateTime? + +model: T - - - +Widget buildTransitions() + + + +dynamic markWithError() + +dynamic markAsLoading() + +dynamic markAsFetched() + +dynamic markAsSaved() - - - - - - - - ThemeSettingChange - - + + + - - - +settings: ThemeSettings + + + AsyncValue - - - - - - - - ThemeSettings - - + + + - - - +sourceColor: Color - +themeMode: ThemeMode + + + ModelRepositoryException - - - + + + - - - Notification + + + Exception - - - - - + + + - - - ThemeProvider + + + ModelNotFoundException - - - +settings: ValueNotifier<ThemeSettings> - +lightDynamic: ColorScheme? - +darkDynamic: ColorScheme? - +pageTransitionsTheme: PageTransitionsTheme - +shapeMedium: ShapeBorder + + + + + + + + + IModelRepository - - - +Color custom() - +Color blend() - +Color source() - +ColorScheme colors() - +CardTheme cardTheme() - +ListTileThemeData listTileTheme() - +AppBarTheme appBarTheme() - +SnackBarThemeData snackBarThemeData() - +TabBarTheme tabBarTheme() - +BottomAppBarTheme bottomAppBarTheme() - +BottomNavigationBarThemeData bottomNavigationBarTheme() - +SwitchThemeData switchTheme() - +InputDecorationTheme inputDecorationTheme() - +TextTheme textTheme() - +DividerThemeData dividerTheme() - +NavigationRailThemeData navigationRailTheme() - +DrawerThemeData drawerTheme() - +IconThemeData iconTheme() - +CheckboxThemeData checkboxTheme() - +RadioThemeData radioTheme() - +TooltipThemeData tooltipTheme() - +ThemeData light() - +ThemeData dark() - +ThemeMode themeMode() - +ThemeData theme() - <static>+ThemeProvider of() - +bool updateShouldNotify() + + + +String getKey() + +WrappedModel<T>? get() + +dynamic fetchAll() + +dynamic fetch() + +dynamic save() + +dynamic delete() + +dynamic duplicateAndSave() + +dynamic duplicateAndSaveFromRemote() + +Stream<WrappedModel<T>> watch() + +Stream<List<WrappedModel<T>>> watchAll() + +Stream<ModelEvent<T>> watchChanges() + +Stream<ModelEvent<T>> watchAllChanges() + +dynamic ensurePersisted() + +void dispose() - - - + + + + - - - ValueNotifier + + + IModelActionProvider - - - - - - - - ColorScheme + + + +List<ModelAction<dynamic>> availableActions() - - - + + + - - - PageTransitionsTheme + + + BehaviorSubject - - - + + + - - - ShapeBorder + + + IsFetched - - - + + + - - - InheritedWidget + + + IsSaving - - - + + + - - - Color + + + IsSaved - - - + + + - - - ThemeMode + + + IsDeleted - - - - - + + + + - - - CustomColor + + + SupabaseClientDependant - - - +name: String - +color: Color - +blend: bool + + + +supabaseClient: SupabaseClient - - - +Color value() + + + + + + + + SupabaseClient - - - - + + + + - - - LanguagePicker + + + SupabaseQueryError - - - +languagePickerType: LanguagePickerType - +iconColor: Color? - +offset: Offset? + + + +statusCode: String? + +message: String + +details: dynamic - - - - + + + + - - - LanguagePickerType + + + SupabaseQueryMixin - - - +index: int - <static>+values: List<LanguagePickerType> - <static>+field: LanguagePickerType - <static>+icon: LanguagePickerType + + + +dynamic deleteAll() + +dynamic getAll() + +dynamic getById() + +dynamic getByColumn() + +List<T> deserializeList() + +T deserializeObject() - - - + + + + - - - Offset + + + IInviteCodeRepository - - - - - - - - - PlatformLocaleWeb + + + +dynamic isCodeAlreadyUsed() - - - +Locale getPlatformLocale() + + + + + + + + + + InviteCodeRepository - - - - - - - - - PlatformLocale + + + +studyId: String + +ref: ProviderRef<dynamic> + +apiClient: StudyUApi + +authRepository: IAuthRepository + +studyRepository: IStudyRepository + +study: Study - - - +Locale getPlatformLocale() + + + +String getKey() + +dynamic isCodeAlreadyUsed() + +List<ModelAction<dynamic>> availableActions() + +dynamic emitUpdate() - - - - + + + - - - PlatformLocaleMobile + + + Study - - - +Locale getPlatformLocale() + + + + + + + + + + InviteCodeRepositoryDelegate - - - - - - - - - AppTranslation + + + +study: Study + +apiClient: StudyUApi + +studyRepository: IStudyRepository - - - <static>+dynamic init() + + + +dynamic fetch() + +dynamic fetchAll() + +dynamic save() + +dynamic delete() + +dynamic onError() + +StudyInvite createDuplicate() + +StudyInvite createNewInstance() - - - - - + + + - - - CountWhereValidator + + + User - - - +predicate: bool Function(T?) - +minCount: int? - +maxCount: int? - <static>+kValidationMessageMinCount: String - <static>+kValidationMessageMaxCount: String - - + + + + - - - +Map<String, dynamic>? validate() + + + Session - - - + + + + - - - bool Function(T?) + + + IAppDelegate - - - - - - - - Validator + + + +dynamic onAppStart() - - - - - + + + + + - - - MustMatchValidator + + + AuthRepository - - - +control: AbstractControl<dynamic>? - +matchingControl: AbstractControl<dynamic>? + + + <static>+PERSIST_SESSION_KEY: String + +supabaseClient: SupabaseClient + +sharedPreferences: SharedPreferences + +allowPasswordReset: bool + +authClient: GoTrueClient + +session: Session? + +currentUser: User? + +isLoggedIn: bool - - - +Map<String, dynamic>? validate() + + + -void _registerAuthListener() + +dynamic signUp() + +dynamic signInWith() + +dynamic signOut() + +dynamic resetPasswordForEmail() + +dynamic updateUser() + -dynamic _persistSession() + -dynamic _resetPersistedSession() + -dynamic _recoverSession() + +void dispose() + +dynamic onAppStart() - - - + + + - - - AbstractControl + + + SharedPreferences - - - - + + + - - - FieldValidators + + + GoTrueClient - - - <static>+String? emailValidator() + + + + + + + + APIException - - - - + + + - - - Patterns + + + StudyNotFoundException - - - <static>+timeFormatString: String - <static>+emailFormatString: String - <static>+url: String + + + + + + + + MeasurementNotFoundException - - - - + + + - - - Time + + + QuestionNotFoundException - - - <static>+dynamic fromTimeOfDay() - +Map<String, dynamic> toJson() - <static>+Time fromJson() + + + + + + + + ConsentItemNotFoundException - - - + + + - - - TimeOfDay + + + InterventionNotFoundException - - - - + + + - - - TimeValueAccessor + + + InterventionTaskNotFoundException - - - +String modelToViewValue() - +Time? viewToModelValue() - -String _addLeadingZeroIfNeeded() + + + + + + + + ReportNotFoundException - - - + + + - - - ControlValueAccessor + + + ReportSectionNotFoundException - - - - - + + + - - - CombinedStreamNotifier + + + StudyInviteNotFoundException - - - -_subscriptions: List<StreamSubscription<dynamic>> + + + + + + + + UserNotFoundException - - - +void dispose() + + + + + + + + + + StudyUApiClient - - - - + + + +supabaseClient: SupabaseClient + <static>+studyColumns: List<String> + <static>+studyWithParticipantActivityColumns: List<String> + +testDelayMilliseconds: int + + - - - ChangeNotifier + + + +dynamic deleteParticipants() + +dynamic getUserStudies() + +dynamic fetchStudy() + +dynamic deleteStudy() + +dynamic saveStudy() + +dynamic fetchStudyInvite() + +dynamic saveStudyInvite() + +dynamic deleteStudyInvite() + +dynamic fetchAppConfig() + +dynamic fetchUser() + +dynamic saveUser() + -dynamic _awaitGuarded() + -dynamic _apiException() + -dynamic _testDelay() - - - - + + + + - - - ModelAction + + + AppTranslation - - - +type: T - +label: String - +icon: IconData? - +onExecute: Function - +isAvailable: bool - +isDestructive: bool + + + <static>+dynamic init() - - - - + + + + - - - IModelActionProvider + + + LanguagePicker - - - +List<ModelAction<dynamic>> availableActions() + + + +languagePickerType: LanguagePickerType + +iconColor: Color? + +offset: Offset? - - - - + + + + - - - IListActionProvider + + + LanguagePickerType - - - +void onSelectItem() - +void onNewItem() + + + +index: int + <static>+values: List<LanguagePickerType> + <static>+field: LanguagePickerType + <static>+icon: LanguagePickerType - - - - - - - - ModelActionType - - + + + - - - +index: int - <static>+values: List<ModelActionType> - <static>+edit: ModelActionType - <static>+delete: ModelActionType - <static>+remove: ModelActionType - <static>+duplicate: ModelActionType - <static>+clipboard: ModelActionType - <static>+primary: ModelActionType + + + Color - - - - - + + + - - - StudyUException + + + Offset - - - +message: String + + + + + + + + + PlatformLocale - - - +String toString() + + + +Locale getPlatformLocale() - - - + + + + - - - Exception + + + PlatformLocaleMobile - - - - - - - - - - ExecutionLimiter + + + +Locale getPlatformLocale() - - - +milliseconds: int - <static>-_timer: Timer? + + + + + + + + + PlatformLocaleWeb - - - +void dispose() + + + +Locale getPlatformLocale() - - - + + + + - - - Timer + + + GoRouteParamEnum - - - - - - - - - - Debouncer + + + +String toRouteParam() + +String toShortString() - - - +leading: bool - +cancelUncompleted: bool - -_uncompletedFutureOperation: CancelableOperation<dynamic>? + + + + + + + + + RouterKeys - - - +dynamic call() + + + <static>+studyKey: ValueKey<String> + <static>+authKey: ValueKey<String> - - - + + + - - - CancelableOperation + + + ValueKey - - - - + + + + - - - Throttler + + + RouteParams - - - +dynamic call() + + + <static>+studiesFilter: String + <static>+studyId: String + <static>+measurementId: String + <static>+interventionId: String + <static>+testAppRoute: String - - - - - + + + + + - - - JsonFileLoader + + + RouterConf - - - +jsonAssetsPath: String + + + <static>+router: GoRouter + <static>+routes: List<GoRoute> + <static>+publicRoutes: List<GoRoute> + <static>+privateRoutes: List<GoRoute> - - - +dynamic loadJson() - +dynamic parseJsonMapFromAssets() - +dynamic parseJsonListFromAssets() + + + <static>+GoRoute route() - - - - - - - - FileFormatEncoder - - + + + - - - +dynamic encodeAsync() - +String encode() - +dynamic call() + + + GoRouter - - - - + + + + - - - CSVStringEncoder + + + StudyFormRouteArgs - - - +String encode() + + + +studyId: String - - - - + + + + - - - JsonStringEncoder + + + QuestionFormRouteArgs - - - +String encode() + + + +questionId: String - - - - - + + + - - - OptimisticUpdate + + + ScreenerQuestionFormRouteArgs - - - +applyOptimistic: void Function() - +apply: dynamic Function() - +rollback: void Function() - +onUpdate: void Function()? - +onError: void Function(Object, StackTrace?)? - +rethrowErrors: bool - +runOptimistically: bool - +completeFutureOptimistically: bool + + + + + + + + + ConsentItemFormRouteArgs - - - +dynamic execute() - -void _runUpdateHandlerIfAny() + + + +consentId: String - - - + + + + - - - void Function() + + + MeasurementFormRouteArgs - - - - - - - - void Function()? + + + +measurementId: String - - - + + + + - - - void Function(Object, StackTrace?)? + + + SurveyQuestionFormRouteArgs - - - - - - - - - - Tuple + + + +questionId: String - - - +first: T1 - +second: T2 - +props: List<Object?> + + + + + + + + + InterventionFormRouteArgs - - - +Map<String, dynamic> toJson() - <static>+Tuple<dynamic, dynamic> fromJson() - +Tuple<T1, T2> copy() - +Tuple<T1, T2> copyWith() + + + +interventionId: String - - - + + + + - - - Equatable + + + InterventionTaskFormRouteArgs - - - - - - - - - - SuppressedBehaviorSubject + + + +taskId: String - - - +subject: BehaviorSubject<T> - +didSuppressInitialEvent: bool - -_controller: StreamController<T> + + + + + + + + + ReportItemFormRouteArgs - - - -StreamController<T> _buildDerivedController() - +dynamic close() + + + +sectionId: String - - - + + + + - - - StreamController + + + RoutingIntents + + + + + + <static>+root: RoutingIntent + <static>+studies: RoutingIntent + <static>+studiesShared: RoutingIntent + <static>+publicRegistry: RoutingIntent + <static>+study: RoutingIntent Function(String) + <static>+studyEdit: RoutingIntent Function(String) + <static>+studyEditInfo: RoutingIntent Function(String) + <static>+studyEditEnrollment: RoutingIntent Function(String) + <static>+studyEditInterventions: RoutingIntent Function(String) + <static>+studyEditIntervention: RoutingIntent Function(String, String) + <static>+studyEditMeasurements: RoutingIntent Function(String) + <static>+studyEditReports: RoutingIntent Function(String) + <static>+studyEditMeasurement: RoutingIntent Function(String, String) + <static>+studyTest: RoutingIntent Function(String, {String? appRoute}) + <static>+studyRecruit: RoutingIntent Function(String) + <static>+studyMonitor: RoutingIntent Function(String) + <static>+studyAnalyze: RoutingIntent Function(String) + <static>+studySettings: RoutingIntent Function(String) + <static>+accountSettings: RoutingIntent + <static>+studyNew: RoutingIntent + <static>+login: RoutingIntent + <static>+signup: RoutingIntent + <static>+passwordForgot: RoutingIntent + <static>+passwordForgot2: RoutingIntent Function(String) + <static>+passwordRecovery: RoutingIntent + <static>+error: RoutingIntent Function(Exception) - - - - - + + + + + - - - NumericalRangeFormatter + + + RoutingIntent - - - +min: int? - +max: int? + + + +route: GoRoute + +params: Map<String, String> + +queryParams: Map<String, String> + +dispatch: RoutingIntentDispatch? + +extra: Object? + +routeName: String + +arguments: Map<String, String> + +props: List<Object?> - - - +TextEditingValue formatEditUpdate() + + + -dynamic _validateRoute() + +bool matches() - - - + + + - - - TextInputFormatter + + + RoutingIntent Function(String) - - - - + + + - - - StudySequenceFormatter + + + RoutingIntent Function(String, String) - - - +TextEditingValue formatEditUpdate() + + + + + + + + RoutingIntent Function(String, {String? appRoute}) - - - - + + + - - - SerializableColor + + + RoutingIntent Function(Exception) - - - +Map<String, dynamic> toJson() - <static>+SerializableColor fromJson() + + + + + + + + GoRoute - - - - + + + + - - - IProviderArgsResolver + + + RoutingIntentDispatch - - - +R provide() + + + +index: int + <static>+values: List<RoutingIntentDispatch> + <static>+go: RoutingIntentDispatch + <static>+push: RoutingIntentDispatch - - - - + + + - - - Config + + + Equatable - - - <static>+isDebugMode: bool - <static>+defaultLocale: Set<String> - <static>+supportedLocales: Map<String, String> - <static>+newStudyId: String - <static>+newModelId: String - <static>+minSplashTime: int - <static>+formAutosaveDebounce: int + + + + + + + + + + StudyTemplates - - - - + + + <static>+kUnnamedStudyTitle: String + + - - - FormValidationSetEnum + + + <static>+Study emptyDraft() - - - - - + + + + - - - FormControlValidation + + + StudyActionType - - - +control: AbstractControl<dynamic> - +validators: List<Validator<dynamic>> - +asyncValidators: List<AsyncValidator<dynamic>>? - +validationMessages: Map<String, String Function(Object)> + + + +index: int + <static>+values: List<StudyActionType> + <static>+pin: StudyActionType + <static>+pinoff: StudyActionType + <static>+edit: StudyActionType + <static>+duplicate: StudyActionType + <static>+duplicateDraft: StudyActionType + <static>+addCollaborator: StudyActionType + <static>+export: StudyActionType + <static>+delete: StudyActionType - - - +FormControlValidation merge() + + + + + + + + ResultTypes - - - - + + + + - - - ManagedFormViewModel + + + MeasurementResultTypes - - - +ManagedFormViewModel<T> createDuplicate() + + + <static>+questionnaire: String + <static>+values: List<String> - - - - - + + + + - - - FormViewModel + + + InterventionResultTypes - - - -_formData: T? - -_formMode: FormMode - -_validationSet: FormValidationSetEnum? - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? - +autosave: bool - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> - -_immediateFormChildrenListenerDebouncer: Debouncer? - -_autosaveOperation: CancelableOperation<dynamic>? - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> - +prevFormValue: Map<String, dynamic>? - <static>-_formKey: String - +formData: T? - +formMode: FormMode - +isReadonly: bool - +validationSet: FormValidationSetEnum? - +isDirty: bool - +title: String - +isValid: bool - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + + + <static>+checkmarkTask: String + <static>+values: List<String> - - - -dynamic _setFormData() - -dynamic _rememberDefaultControlValidators() - -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() - -dynamic _disableAllControls() - -dynamic _formModeUpdated() - -dynamic _restoreControlsFromFormData() - +void revalidate() - -void _applyValidationSet() - +void read() - +dynamic save() - +dynamic cancel() - +void enableAutosave() - +void listenToImmediateFormChildren() - +dynamic markFormGroupChanged() - +void dispose() - +void setControlsFrom() - +T buildFormData() - +void initControls() + + + + + + + + + StudyExportData - - - - - - - - FormViewModelNotFoundException + + + +study: Study + +measurementsData: List<Map<String, dynamic>> + +interventionsData: List<Map<String, dynamic>> + +isEmpty: bool - - - - - + + + + - - - FormViewModelCollection + + + FormSideSheetTab - - - +formViewModels: List<T> - +formArray: FormArray<dynamic> - +stagedViewModels: List<T> - +retrievableViewModels: List<T> - +formData: List<D> + + + +formViewBuilder: Widget Function(T) - - - +void add() - +T remove() - +T? findWhere() - +T? removeWhere() - +bool contains() - +void stage() - +T commit() - +void reset() - +void read() + + + + + + + + Widget Function(T) - - - + + + + - - - FormArray + + + NavbarTab - - - - - - - - - - FormArrayTable + + + +title: String + +intent: RoutingIntent? + +index: int + +enabled: bool - - - +control: AbstractControl<dynamic> - +items: List<T> - +onSelectItem: void Function(T) - +getActionsAt: List<ModelAction<dynamic>> Function(T, int) - +onNewItem: void Function()? - +rowTitle: String Function(T) - +onNewItemLabel: String - +sectionTitle: String? - +sectionDescription: String? - +emptyIcon: IconData? - +emptyTitle: String? - +emptyDescription: String? - +sectionTitleDivider: bool? - +rowPrefix: Widget Function(BuildContext, T, int)? - +rowSuffix: Widget Function(BuildContext, T, int)? - +leadingWidget: Widget? - +itemsSectionPadding: EdgeInsets? - +hideLeadingTrailingWhenEmpty: bool - <static>+columns: List<StandardTableColumn> + + + + + + + + + SidesheetTab - - - +Widget build() - -List<Widget> _buildRow() - -Widget _newItemButton() + + + +builder: Widget Function(BuildContext) - - - + + + - - - void Function(T) + + + Widget Function(BuildContext) - - - + + + + - - - List<ModelAction<dynamic>> Function(T, int) + + + Sidesheet - - - - - - - - String Function(T) + + + <static>+kDefaultWidth: double + +titleText: String + +body: Widget? + +tabs: List<SidesheetTab>? + +actionButtons: List<Widget>? + +width: double? + +withCloseButton: bool + +ignoreAppBar: bool + +collapseSingleTab: bool + +bodyPadding: EdgeInsets? + +wrapContent: Widget Function(Widget)? - - - + + + - - - Widget Function(BuildContext, T, int)? + + + Widget - + - + EdgeInsets - - - - - - - - - IFormData - - - - - - +id: String - - + + + - - - +IFormData copy() + + + Widget Function(Widget)? - - - - - + + + + - - - CustomFormControl + + + MouseEventsRegion - - - -_onValueChangedDebouncer: Debouncer? - -_onStatusChangedDebouncer: Debouncer? - +onValueChanged: void Function(T?)? - +onStatusChanged: void Function(ControlStatus)? - +onStatusChangedDebounceTime: int? - +onValueChangedDebounceTime: int? + + + +onTap: void Function()? + +onHover: void Function(PointerHoverEvent)? + +onEnter: void Function(PointerEnterEvent)? + +onExit: void Function(PointerExitEvent)? + +autoselectCursor: bool + +cursor: SystemMouseCursor + <static>+defaultCursor: SystemMouseCursor + +autoCursor: SystemMouseCursor - - - +void dispose() + + + + + + + + void Function(PointerHoverEvent)? - - - + + + - - - void Function(T?)? + + + void Function(PointerEnterEvent)? - - - + + + - - - void Function(ControlStatus)? + + + void Function(PointerExitEvent)? - - - + + + - - - FormControl + + + SystemMouseCursor - - - + + + - - - FormInvalidException + + + ReactiveCustomColorPicker - - - - - - - - FormConfigException - - + + + - - - +message: String? + + + ReactiveFormField - - - - + + + + - - - IFormViewModelDelegate + + + SplashPage - - - +dynamic onSave() - +void onCancel() + + + +Widget build() - - - - + + + + + - - - IFormGroupController + + + ErrorPage - - - +form: FormGroup + + + +error: Exception? + + + + + + +Widget build() - - - + + + - - - FormGroup + + + ConsumerWidget - - - - + + + + + - - - FormControlOption + + + AsyncValueWidget - - - +value: T - +label: String - +description: String? - +props: List<Object?> + + + +value: AsyncValue<T> + +data: Widget Function(T) + +error: Widget Function(Object, StackTrace?)? + +loading: Widget Function()? + +empty: Widget Function()? + + + + + + +Widget build() + -Widget _buildDataOrEmptyWidget() + -Widget _defaultError() + -Widget _defaultLoad() - - - - + + + - - - FormMode + + + Widget Function(Object, StackTrace?)? - - - +index: int - <static>+values: List<FormMode> - <static>+create: FormMode - <static>+readonly: FormMode - <static>+edit: FormMode + + + + + + + + Widget Function()? - - - - + + + + - - - UnsavedChangesDialog + + + Search - - - +Widget build() + + + +onQueryChanged: dynamic Function(String) + +searchController: SearchController? + +hintText: String? + +initialText: String? - - - - - + + + - - - DrawerEntry + + + dynamic Function(String) - - - +localizedTitle: String Function() - +icon: IconData? - +localizedHelpText: String Function()? - +enabled: bool - +onSelected: void Function(BuildContext, WidgetRef)? - +title: String - +helpText: String? + + + + + + + + + SearchController - - - +void onClick() + + + +setText: void Function(String) - - - + + + - - - String Function() + + + void Function(String) - - - + + + + + - - - String Function()? + + + HtmlStylingBanner - - - - + + + +isDismissed: bool + +onDismissed: dynamic Function()? + + - - - void Function(BuildContext, WidgetRef)? + + + +Widget build() - - - - - + + + - - - GoRouterDrawerEntry + + + dynamic Function()? - - - +intent: RoutingIntent - - + + + + - - - +void onClick() + + + NullHelperDecoration - - - - - + + + - - - RoutingIntent + + + InputDecoration - - - +route: GoRoute - +params: Map<String, String> - +queryParams: Map<String, String> - +dispatch: RoutingIntentDispatch? - +extra: Object? - +routeName: String - +arguments: Map<String, String> - +props: List<Object?> + + + + + + + + + IWithBanner - - - -dynamic _validateRoute() - +bool matches() + + + +Widget? banner() - - - - + + + + - - - AppDrawer + + + BannerBox - - - +title: String - +width: int - +leftPaddingEntries: double - +logoPaddingVertical: double - +logoPaddingHorizontal: double - +logoMaxHeight: double - +logoSectionMinHeight: double - +logoSectionMaxHeight: double + + + +prefixIcon: Widget? + +body: Widget + +style: BannerStyle + +padding: EdgeInsets? + +noPrefix: bool + +dismissable: bool + +isDismissed: bool? + +onDismissed: dynamic Function()? + +dismissIconSize: double + + + + + + + + + + + + BannerStyle + + + + + + +index: int + <static>+values: List<BannerStyle> + <static>+warning: BannerStyle + <static>+info: BannerStyle + <static>+error: BannerStyle - - - - + + + + + - - - AuthScaffold + + + ConstrainedWidthFlexible - - - +body: Widget - +formKey: AuthFormKey - +leftContentMinWidth: double - +leftPanelMinWidth: double - +leftPanelPadding: EdgeInsets + + + +minWidth: double + +maxWidth: double + +flex: int + +flexSum: int + +child: Widget + +outerConstraints: BoxConstraints - - - - - - - - - AuthFormKey + + + +Widget build() + -double _getWidth() - - - +index: int - <static>+values: List<AuthFormKey> - <static>+login: AuthFormKey - <static>+signup: AuthFormKey - <static>+passwordForgot: AuthFormKey - <static>+passwordRecovery: AuthFormKey - <static>-_loginSubmit: AuthFormKey - <static>-_signupSubmit: AuthFormKey + + + + + + + + BoxConstraints - - - - - + + + + + - - - PasswordRecoveryForm + + + ActionPopUpMenuButton - - - +formKey: AuthFormKey + + + +actions: List<ModelAction<dynamic>> + +triggerIconColor: Color? + +triggerIconColorHover: Color? + +triggerIconSize: double + +disableSplashEffect: bool + +hideOnEmpty: bool + +orientation: Axis + +elevation: double? + +splashRadius: double? + +enabled: bool + +position: PopupMenuPosition - - - +Widget build() + + + +Widget build() + -Widget _buildPopupMenu() - - - - + + + - - - FormConsumerRefWidget + + + Axis - - - +Widget build() + + + + + + + + PopupMenuPosition - - - - - + + + + + - - - LoginForm + + + FormControlLabel - - - +formKey: AuthFormKey + + + +formControl: AbstractControl<dynamic> + +text: String + +isClickable: bool + +textStyle: TextStyle? + +onClick: void Function(AbstractControl<dynamic>)? - - - +Widget build() + + + +Widget build() - - - - - + + + - - - SignupForm + + + AbstractControl - - - +formKey: AuthFormKey - - + + + + - - - +Widget build() - -dynamic _onClickTermsOfUse() - -dynamic _onClickPrivacyPolicy() + + + TextStyle - - - - - + + + - - - PasswordForgotForm + + + void Function(AbstractControl<dynamic>)? - - - +formKey: AuthFormKey - - + + + + + + - - - +Widget build() + + + EmptyBody - - - - - - - - - StudyUJobsToBeDone + + + +icon: IconData? + +leading: Widget? + +leadingSpacing: double? + +title: String? + +description: String? + +button: Widget? - - - +Widget build() + + + +Widget build() - - - - - + + + - - - AuthFormController + + + IconData - - - +authRepository: IAuthRepository - +sharedPreferences: SharedPreferences - +notificationService: INotificationService - +router: GoRouter - +emailControl: FormControl<String> - +passwordControl: FormControl<String> - +passwordConfirmationControl: FormControl<String> - +rememberMeControl: FormControl<bool> - +termsOfServiceControl: FormControl<bool> - <static>+authValidationMessages: Map<String, String Function(dynamic)> - +loginForm: FormGroup - +signupForm: FormGroup - +passwordForgotForm: FormGroup - +passwordRecoveryForm: FormGroup - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> - -_formKey: AuthFormKey - +shouldRemember: bool - +formKey: AuthFormKey - +form: FormGroup + + + + + + + + + ActionMenuType - - - -dynamic _onChangeFormKey() - +dynamic resetControlsFor() - -dynamic _forceValidationMessages() - +dynamic signUp() - -dynamic _signUp() - +dynamic signIn() - -dynamic _signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic sendPasswordResetLink() - +dynamic recoverPassword() - +dynamic updateUser() - -void _setRememberMe() - -void _delRememberMe() - -void _initRememberMe() + + + +index: int + <static>+values: List<ActionMenuType> + <static>+inline: ActionMenuType + <static>+popup: ActionMenuType - - - - - + + + + + - - - IAuthRepository + + + HelpIcon - - - +allowPasswordReset: bool - +currentUser: User? - +isLoggedIn: bool - +session: Session? + + + +tooltipText: String? - - - - - +dynamic signUp() - +dynamic signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic updateUser() - +void dispose() + + + + + +Widget build() - - - + + + + + - - - SharedPreferences + + + StudyULogo - - - - + + + +onTap: void Function()? + + - - - GoRouter + + + +Widget build() - - - - + + + + + - - - EmailTextField + + + SingleColumnLayout - - - +labelText: String - +hintText: String? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + <static>+defaultConstraints: BoxConstraints + <static>+defaultConstraintsNarrow: BoxConstraints + +body: Widget + +header: Widget? + +stickyHeader: bool + +constraints: BoxConstraints? + +scroll: bool + +padding: EdgeInsets? + + + + + + <static>+dynamic fromType() - - - - + + + + - - - PasswordTextField + + + SingleColumnLayoutType - - - +labelText: String - +hintText: String? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + +index: int + <static>+values: List<SingleColumnLayoutType> + <static>+boundedWide: SingleColumnLayoutType + <static>+boundedNarrow: SingleColumnLayoutType + <static>+stretched: SingleColumnLayoutType + <static>+split: SingleColumnLayoutType - - - - + + + + - - - IAppDelegate + + + ISyncIndicatorViewModel - - - +dynamic onAppStart() + + + +isDirty: bool + +lastSynced: DateTime? - - - - - - - - - AppController - - + + + + - - - +sharedPreferences: SharedPreferences - +appDelegates: List<IAppDelegate> - -_delayedFuture: dynamic - +isInitialized: dynamic + + + SyncIndicator - - - +dynamic onAppStart() - -dynamic _callDelegates() + + + +state: AsyncValue<T> + +lastSynced: DateTime? + +isDirty: bool + +animationDuration: int + +iconSize: double - - - - - + + + + + - - - InviteCodeFormView + + + TextParagraph - - - +formViewModel: InviteCodeFormViewModel + + + +text: String? + +style: TextStyle? + +selectable: bool + +span: List<TextSpan>? - - - +Widget build() - -List<FormTableRow> _conditionalInterventionRows() + + + +Widget build() - - - - - + + + + + - - - InviteCodeFormViewModel + + + DismissButton - - - +study: Study - +inviteCodeRepository: IInviteCodeRepository - +codeControl: FormControl<String> - +codeControlValidationMessages: Map<String, String Function(dynamic)> - +isPreconfiguredScheduleControl: FormControl<bool> - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence> - +interventionAControl: FormControl<String> - +interventionBControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +interventionControlOptions: List<FormControlOption<String>> - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>> - +isPreconfiguredSchedule: bool - +preconfiguredSchedule: List<String>? + + + +onPressed: void Function()? + +text: String? - - - +void initControls() - -dynamic _uniqueInviteCode() - +void regenerateCode() - -String _generateCode() - +StudyInvite buildFormData() - +void setControlsFrom() - +dynamic save() + + + +Widget build() - - - - - - - - FormConsumerWidget - - + + + + + - - - +Widget build() + + + Badge - - - - - - - - - StudyRecruitScreen + + + +icon: IconData? + +color: Color? + +borderRadius: double + +label: String + +type: BadgeType + +padding: EdgeInsets + +iconSize: double? + +labelStyle: TextStyle? - - - +Widget build() - -Widget _inviteCodesSectionHeader() - -Widget _newInviteCodeButton() - -dynamic _onSelectInvite() + + + +Widget build() + -Color? _getBackgroundColor() + -Color _getBorderColor() + -Color? _getLabelColor() - - - - - - - - - StudyPageWidget - - + + + + - - - +studyId: String + + + BadgeType - - - +Widget? banner() + + + +index: int + <static>+values: List<BadgeType> + <static>+filled: BadgeType + <static>+outlined: BadgeType + <static>+outlineFill: BadgeType + <static>+plain: BadgeType - - - - - - - - - StudyRecruitController - - + + + + - - - +inviteCodeRepository: IInviteCodeRepository - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + + + Hyperlink - - - -dynamic _subscribeInvites() - +Intervention? getIntervention() - +int getParticipantCountForInvite() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void dispose() + + + +text: String + +url: String? + +onClick: void Function()? + +linkColor: Color + +hoverColor: Color? + +visitedColor: Color? + +style: TextStyle? + +hoverStyle: TextStyle? + +visitedStyle: TextStyle? + +icon: IconData? + +iconSize: double? - - - - + + + + - - - IInviteCodeRepository + + + FormScaffold - - - +dynamic isCodeAlreadyUsed() + + + +formViewModel: T + +actions: List<Widget>? + +body: Widget + +drawer: Widget? + +actionsSpacing: double + +actionsPadding: double - - - + + + + - - - StreamSubscription + + + PrimaryButton - - - - - - - - - - StudyBaseController + + + +text: String + +icon: IconData? + +isLoading: bool + +showLoadingEarliestAfterMs: int + +onPressed: void Function()? + +tooltip: String + +tooltipDisabled: String + +enabled: bool + +onPressedFuture: dynamic Function()? + +innerPadding: EdgeInsets + +minimumSize: Size? + +isDisabled: bool - - - +studyId: String - +studyRepository: IStudyRepository - +router: GoRouter - +studySubscription: StreamSubscription<WrappedModel<Study>>? - - + + + + - - - +dynamic subscribeStudy() - +dynamic onStudySubscriptionUpdate() - +dynamic onStudySubscriptionError() - +void dispose() + + + Size - - - + + + + - - - Study + + + UnderConstruction + + + + + + +Widget build() - - - - - + + + + + - - - EnrolledBadge + + + ActionMenuInline - - - +enrolledCount: int + + + +actions: List<ModelAction<dynamic>> + +iconSize: double? + +visible: bool + +splashRadius: double? + +paddingVertical: double? + +paddingHorizontal: double? - - - +Widget build() + + + +Widget build() - - - - - + + + + + - - - StudyInvitesTable + + + IconPack - - - +invites: List<StudyInvite> - +onSelect: void Function(StudyInvite) - +getActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getIntervention: Intervention? Function(String) - +getParticipantCountForInvite: int Function(StudyInvite) + + + <static>+defaultPack: List<IconOption> + <static>+material: List<IconOption> - - - +Widget build() - -List<Widget> _buildRow() + + + <static>+IconOption? resolveIconByName() - - - + + + + + - - - void Function(StudyInvite) + + + IconOption - - - - - - - - List<ModelAction<dynamic>> Function(StudyInvite) + + + +name: String + +icon: IconData? + +isEmpty: bool + +props: List<Object?> - - - - - - - - Intervention? Function(String) + + + +String toJson() + <static>+IconOption fromJson() - - - + + + - - - int Function(StudyInvite) + + + ReactiveIconPicker - - - - - + + + - - - StudyFormViewModel + + + ReactiveFocusableFormField - - - +studyDirtyCopy: Study? - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +router: GoRouter - +studyInfoFormViewModel: StudyInfoFormViewModel - +enrollmentFormViewModel: EnrollmentFormViewModel - +measurementsFormViewModel: MeasurementsFormViewModel - +reportsFormViewModel: ReportsFormViewModel - +interventionsFormViewModel: InterventionsFormViewModel - +form: FormGroup - +isStudyReadonly: bool - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - - + + + + + + - - - +void read() - +void setControlsFrom() - +Study buildFormData() - +void dispose() - +void onCancel() - +dynamic onSave() - -dynamic _applyAndSaveSubform() + + + IconPicker - - - - - - - - - IStudyRepository + + + +iconOptions: List<IconOption> + +selectedOption: IconOption? + +onSelect: void Function(IconOption)? + +galleryIconSize: double? + +selectedIconSize: double? + +focusNode: FocusNode? + +isDisabled: bool - - - +dynamic launch() - +dynamic deleteParticipants() + + + +Widget build() - - - - - + + + - - - StudyInfoFormViewModel + + + void Function(IconOption)? - - - +study: Study - +titleControl: FormControl<String> - +iconControl: FormControl<IconOption> - +descriptionControl: FormControl<String> - +organizationControl: FormControl<String> - +reviewBoardControl: FormControl<String> - +reviewBoardNumberControl: FormControl<String> - +researchersControl: FormControl<String> - +emailControl: FormControl<String> - +websiteControl: FormControl<String> - +phoneControl: FormControl<String> - +additionalInfoControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +iconRequired: dynamic - +organizationRequired: dynamic - +reviewBoardRequired: dynamic - +reviewBoardNumberRequired: dynamic - +researchersRequired: dynamic - +emailRequired: dynamic - +phoneRequired: dynamic - +emailFormat: dynamic - +websiteFormat: dynamic - - + + + + - - - +void setControlsFrom() - +StudyInfoFormData buildFormData() + + + FocusNode - - - - - + + + + + - - - EnrollmentFormViewModel + + + IconPickerField - - - +study: Study - +router: GoRouter - +consentItemDelegate: EnrollmentFormConsentItemDelegate - +enrollmentTypeControl: FormControl<Participation> - +consentItemArray: FormArray<dynamic> - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +form: FormGroup - +enrollmentTypeControlOptions: List<FormControlOption<Participation>> - +consentItemModels: List<ConsentItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestScreener: bool - +canTestConsent: bool - +questionTitles: Map<FormMode, String Function()> + + + +iconOptions: List<IconOption> + +selectedOption: IconOption? + +selectedIconSize: double? + +galleryIconSize: double? + +onSelect: void Function(IconOption)? + +focusNode: FocusNode? + +isDisabled: bool - - - +void setControlsFrom() - +EnrollmentFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() - +dynamic testScreener() - +dynamic testConsent() - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + + + +Widget build() - - - - - + + + + + - - - MeasurementsFormViewModel + + + IconPickerGallery - - - +study: Study - +router: GoRouter - +measurementsArray: FormArray<dynamic> - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> - +form: FormGroup - +measurementViewModels: List<MeasurementSurveyFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +measurementRequired: dynamic - +titles: Map<FormMode, String> + + + +iconOptions: List<IconOption> + +onSelect: void Function(IconOption)? + +iconSize: double - - - +void read() - +void setControlsFrom() - +MeasurementsFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +MeasurementSurveyFormViewModel provide() - +void onCancel() - +dynamic onSave() + + + +Widget build() - - - - - + + + + - - - ReportsFormViewModel + + + FormConsumerWidget - - - +study: Study - +router: GoRouter - +reportItemDelegate: ReportFormItemDelegate - +reportItemArray: FormArray<dynamic> - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +form: FormGroup - +reportItemModels: List<ReportItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestConsent: bool + + + +Widget build() - - - +void setControlsFrom() - +ReportsFormData buildFormData() - +void read() - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() - +ReportItemFormRouteArgs buildReportItemFormRouteArgs() - +dynamic testReport() - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() + + + + + + + + + FormConsumerRefWidget - - - - - - - - - - InterventionsFormViewModel + + + +Widget build() - - - +study: Study - +router: GoRouter - +interventionsArray: FormArray<dynamic> - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> - +form: FormGroup - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +interventionsRequired: dynamic - +titles: Map<FormMode, String> - +canTestStudySchedule: bool + + + + + + + + + Collapsible - - - +void setControlsFrom() - +InterventionsFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +InterventionFormViewModel provide() - +void onCancel() - +dynamic onSave() - +dynamic testStudySchedule() + + + +contentBuilder: Widget Function(BuildContext, bool) + +headerBuilder: Widget Function(BuildContext, bool)? + +title: String? + +isCollapsed: bool - - - - + + + - - - ConsentItemFormView + + + Widget Function(BuildContext, bool) - - - +formViewModel: ConsentItemFormViewModel + + + + + + + + Widget Function(BuildContext, bool)? - - - - - + + + + + - - - ConsentItemFormViewModel + + + StandardDialog - - - +consentIdControl: FormControl<String> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +iconControl: FormControl<IconOption> - +form: FormGroup - +consentId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +titles: Map<FormMode, String> + + + +title: Widget? + +titleText: String? + +body: Widget + +actionButtons: List<Widget> + +backgroundColor: Color? + +borderRadius: double? + +width: double? + +height: double? + +minWidth: double + +minHeight: double + +maxWidth: double? + +maxHeight: double? + +padding: EdgeInsets - - - +void setControlsFrom() - +ConsentItemFormData buildFormData() - +ConsentItemFormViewModel createDuplicate() + + + +Widget build() - - - - - + + + + + - - - EnrollmentFormData + + + SecondaryButton - - - <static>+kDefaultEnrollmentType: Participation - +enrollmentType: Participation - +questionnaireFormData: QuestionnaireFormData - +consentItemsFormData: List<ConsentItemFormData>? - +id: String + + + +text: String + +icon: IconData? + +isLoading: bool + +onPressed: void Function()? - - - +Study apply() - +EnrollmentFormData copy() + + + +Widget build() - - - + + + + - - - Participation + + + StandardTableColumn + + + + + + +label: String + +tooltip: String? + +columnWidth: TableColumnWidth + +sortable: bool + +sortAscending: bool? + +sortableIcon: Widget? - - - - - + + + - - - QuestionnaireFormData + + + TableColumnWidth - - - +questionsData: List<QuestionFormData>? - +id: String + + + + + + + + + StandardTable - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() + + + +items: List<T> + +inputColumns: List<StandardTableColumn> + +onSelectItem: void Function(T) + +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)? + +trailingActionsMenuType: ActionMenuType? + +sortColumnPredicates: List<int Function(T, T)?>? + +pinnedPredicates: int Function(T, T)? + +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? + +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? + +inputTrailingActionsColumn: StandardTableColumn + +tableWrapper: Widget Function(Widget)? + +cellSpacing: double + +rowSpacing: double + +minRowHeight: double? + +showTableHeader: bool + +hideLeadingTrailingWhenEmpty: bool + +leadingWidget: Widget? + +trailingWidget: Widget? + +leadingWidgetSpacing: double? + +trailingWidgetSpacing: double? + +emptyWidget: Widget? + +rowStyle: StandardTableStyle + +disableRowInteractions: bool - - - - + + + - - - IStudyFormData + + + void Function(T) - - - +Study apply() + + + + + + + + List<ModelAction<dynamic>> Function(T, int)? - - - - + + + - - - StudyDesignEnrollmentFormView + + + int Function(T, T)? - - - +Widget build() - -dynamic _showScreenerQuestionSidesheetWithArgs() - -dynamic _showConsentItemSidesheetWithArgs() + + + + + + + + TableRow Function(BuildContext, List<StandardTableColumn>)? - - - - + + + + - - - StudyDesignPageWidget + + + StandardTableStyle - - - +Widget? banner() + + + +index: int + <static>+values: List<StandardTableStyle> + <static>+plain: StandardTableStyle + <static>+material: StandardTableStyle - - - - + + + + - - - IScreenerQuestionLogicFormViewModel + + + TwoColumnLayout - - - +isDirtyOptionsBannerVisible: bool + + + <static>+defaultDivider: VerticalDivider + <static>+defaultContentPadding: EdgeInsets + <static>+slimContentPadding: EdgeInsets + +leftWidget: Widget + +rightWidget: Widget + +dividerWidget: Widget? + +headerWidget: Widget? + +flexLeft: int? + +flexRight: int? + +constraintsLeft: BoxConstraints? + +constraintsRight: BoxConstraints? + +scrollLeft: bool + +scrollRight: bool + +paddingLeft: EdgeInsets? + +paddingRight: EdgeInsets? + +backgroundColorLeft: Color? + +backgroundColorRight: Color? + +stretchHeight: bool - - - - - + + + - - - ScreenerQuestionLogicFormView + + + VerticalDivider - - - +formViewModel: ScreenerQuestionFormViewModel + + + + + + + + + TabbedNavbar - - - +Widget build() - -dynamic _buildInfoBanner() - -dynamic _buildAnswerOptionsLogicControls() - -List<Widget> _buildOptionLogicRow() + + + +tabs: List<T> + +selectedTab: T? + +indicator: BoxDecoration? + +height: double? + +disabledBackgroundColor: Color? + +disabledTooltipText: String? + +onSelect: void Function(int, T)? + +labelPadding: EdgeInsets? + +labelSpacing: double? + +indicatorSize: TabBarIndicatorSize? + +isScrollable: bool + +backgroundColor: Color? + +labelColorHover: Color? + +unselectedLabelColorHover: Color? - - - - - + + + - - - ScreenerQuestionFormViewModel + + + BoxDecoration - - - <static>+defaultResponseOptionValidity: bool - +responseOptionsDisabledArray: FormArray<dynamic> - +responseOptionsLogicControls: FormArray<bool> - +responseOptionsLogicDescriptionControls: FormArray<String> - -_questionBaseControls: Map<String, AbstractControl<dynamic>> - +prevResponseOptionControls: List<AbstractControl<dynamic>> - +prevResponseOptionValues: List<dynamic> - +responseOptionsDisabledControls: List<AbstractControl<dynamic>> - +logicControlOptions: List<FormControlOption<bool>> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isDirtyOptionsBannerVisible: bool - - + + + + - - - +dynamic onResponseOptionsChanged() - +void setControlsFrom() - +QuestionFormData buildFormData() - -List<FormControl<dynamic>> _copyFormControls() - -AbstractControl<dynamic>? _findAssociatedLogicControlFor() - -AbstractControl<dynamic>? _findAssociatedControlFor() - +ScreenerQuestionFormViewModel createDuplicate() + + + void Function(int, T)? - - - - - + + + - - - QuestionFormViewModel + + + TabBarIndicatorSize - - - <static>+defaultQuestionType: SurveyQuestionType - -_titles: Map<FormMode, String Function()>? - +questionIdControl: FormControl<String> - +questionTypeControl: FormControl<SurveyQuestionType> - +questionTextControl: FormControl<String> - +questionInfoTextControl: FormControl<String> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isMultipleChoiceControl: FormControl<bool> - +choiceResponseOptionsArray: FormArray<dynamic> - +customOptionsMin: int - +customOptionsMax: int - +customOptionsInitial: int - +boolResponseOptionsArray: FormArray<String> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool + + + + + + + + + FormTableRow - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +QuestionFormViewModel createDuplicate() + + + +label: String? + +labelBuilder: Widget Function(BuildContext)? + +labelStyle: TextStyle? + +labelHelpText: String? + +input: Widget + +control: AbstractControl<dynamic>? + +layout: FormTableRowLayout? - - - - - + + + - - - EnrollmentFormConsentItemDelegate + + + Widget Function(BuildContext)? - - - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +owner: EnrollmentFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + + + + + + + FormTableRowLayout - - - +void onCancel() - +dynamic onSave() - +ConsentItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +index: int + <static>+values: List<FormTableRowLayout> + <static>+vertical: FormTableRowLayout + <static>+horizontal: FormTableRowLayout - - - - - + + + + + - - - WithQuestionnaireControls + + + FormTableLayout - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> + + + +rows: List<FormTableRow> + +columnWidths: Map<int, TableColumnWidth> + +rowDivider: Widget? + +rowLayout: FormTableRowLayout? + +rowLabelStyle: TextStyle? - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() + + + +Widget build() - - - - - + + + + + - - - ConsentItemFormData + + + FormSectionHeader - - - +consentId: String - +title: String - +description: String - +iconName: String? - +id: String + + + +title: String + +titleTextStyle: TextStyle? + +helpText: String? + +divider: bool + +helpTextDisabled: bool - - - +ConsentItem toConsentItem() - +ConsentItemFormData copy() + + + +Widget build() - - - - - + + + + + - - - InterventionsFormData + + + FormLabel - - - +interventionsData: List<InterventionFormData> - +studyScheduleData: StudyScheduleFormData - +id: String + + + +labelText: String? + +helpText: String? + +labelTextStyle: TextStyle? + +layout: FormTableRowLayout? - - - +Study apply() - +InterventionsFormData copy() + + + +Widget build() - - - - - - - - - StudyScheduleFormData - - + + + + - - - +sequenceType: PhaseSequence - +sequenceTypeCustom: String - +numCycles: int - +phaseDuration: int - +includeBaseline: bool - +id: String + + + NotificationDispatcher - - - +StudySchedule toStudySchedule() - +Study apply() - +StudyScheduleFormData copy() + + + +child: Widget? + +snackbarInnerPadding: double + +snackbarWidth: double? + +snackbarBehavior: SnackBarBehavior + +snackbarDefaultDuration: int - - - - - + + + - - - InterventionTaskFormViewModel + + + SnackBarBehavior - - - +taskIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +taskTitleControl: FormControl<String> - +taskDescriptionControl: FormControl<String> - +markAsCompletedControl: FormControl<bool> - +form: FormGroup - +taskId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +titles: Map<FormMode, String> + + + + + + + + + INotificationService - - - +void setControlsFrom() - +InterventionTaskFormData buildFormData() - +InterventionTaskFormViewModel createDuplicate() + + + +void showMessage() + +void show() + +Stream<NotificationIntent> watchNotifications() + +void dispose() - - - - - + + + + + - - - WithScheduleControls + + + NotificationService - - - +isTimeRestrictedControl: FormControl<bool> - +instanceID: FormControl<String> - +restrictedTimeStartControl: FormControl<Time> - +restrictedTimeStartPickerControl: FormControl<TimeOfDay> - +restrictedTimeEndControl: FormControl<Time> - +restrictedTimeEndPickerControl: FormControl<TimeOfDay> - +hasReminderControl: FormControl<bool> - +reminderTimeControl: FormControl<Time> - +reminderTimePickerControl: FormControl<TimeOfDay> - -_reminderControlStream: StreamSubscription<dynamic>? - +scheduleFormControls: Map<String, FormControl<Object>> - +hasReminder: bool - +isTimeRestricted: bool - +timeRestriction: List<Time>? + + + -_streamController: BehaviorSubject<NotificationIntent> - - - +void setScheduleControlsFrom() - -dynamic _initReminderControl() + + + +Stream<NotificationIntent> watchNotifications() + +void showMessage() + +void show() + +void dispose() - - - - + + + + + - - - InterventionTaskFormView + + + NotificationIntent - - - +formViewModel: InterventionTaskFormViewModel + + + +message: String? + +customContent: Widget? + +icon: IconData? + +actions: List<NotificationAction>? + +type: NotificationType + + + + + + +void register() - - - + + + + - - - PhaseSequence + + + NotificationType - - - - - + + + +index: int + <static>+values: List<NotificationType> + <static>+snackbar: NotificationType + <static>+alert: NotificationType + <static>+custom: NotificationType + + - - - InterventionFormView + + + + + + + + + NotificationAction - - - +formViewModel: InterventionFormViewModel + + + +label: String + +onSelect: dynamic Function() + +isDestructive: bool - - - - - + + + - - - InterventionFormViewModel + + + dynamic Function() - - - +study: Study - +interventionIdControl: FormControl<String> - +interventionTitleControl: FormControl<String> - +interventionIconControl: FormControl<IconOption> - +interventionDescriptionControl: FormControl<String> - +interventionTasksArray: FormArray<dynamic> - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> - +form: FormGroup - +interventionId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneTask: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> + + + + + + + + + SnackbarIntent - - - +void setControlsFrom() - +InterventionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +void onCancel() - +dynamic onSave() - +InterventionTaskFormViewModel provide() - +InterventionTaskFormRouteArgs buildNewFormRouteArgs() - +InterventionTaskFormRouteArgs buildFormRouteArgs() - +InterventionFormViewModel createDuplicate() + + + +duration: int? - - - - - - - - - StudyScheduleControls - - + + + + - - - <static>+defaultScheduleType: PhaseSequence - <static>+defaultScheduleTypeSequence: String - <static>+defaultNumCycles: int - <static>+defaultPeriodLength: int - +sequenceTypeControl: FormControl<PhaseSequence> - +sequenceTypeCustomControl: FormControl<String> - +phaseDurationControl: FormControl<int> - +numCyclesControl: FormControl<int> - +includeBaselineControl: FormControl<bool> - +studyScheduleControls: Map<String, FormControl<Object>> - <static>+kNumCyclesMin: int - <static>+kNumCyclesMax: int - <static>+kPhaseDurationMin: int - <static>+kPhaseDurationMax: int - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +numCyclesRange: dynamic - +phaseDurationRange: dynamic - +customSequenceRequired: dynamic + + + AlertIntent - - - +void setStudyScheduleControlsFrom() - +StudyScheduleFormData buildStudyScheduleFormData() - +bool isSequencingCustom() + + + +title: String + +dismissOnAction: bool + +isDestructive: dynamic - - - - - + + + + - - - InterventionFormData + + + IClipboardService - - - +interventionId: String - +title: String - +description: String? - +tasksData: List<InterventionTaskFormData>? - +iconName: String? - <static>+kDefaultTitle: String - +id: String + + + +dynamic copy() - - - +Intervention toIntervention() - +InterventionFormData copy() + + + + + + + + + ClipboardService - - - - - - - - - - StudyScheduleFormView + + + +dynamic copy() - - - +formViewModel: StudyScheduleControls + + + + + + + + + Notifications - - - -FormTableRow _renderCustomSequence() - +Widget build() + + + <static>+passwordReset: SnackbarIntent + <static>+passwordResetSuccess: SnackbarIntent + <static>+studyDeleted: SnackbarIntent + <static>+inviteCodeDeleted: SnackbarIntent + <static>+inviteCodeClipped: SnackbarIntent + <static>+studyDeleteConfirmation: AlertIntent - - - - + + + + - - - StudyDesignInterventionsFormView + + + NotificationDefaultActions - - - +Widget build() + + + <static>+cancel: NotificationAction - - - - - + + + + + - - - InterventionTaskFormData + + + DrawerEntry - - - +taskId: String - +taskTitle: String - +taskDescription: String? - <static>+kDefaultTitle: String - +id: String + + + +localizedTitle: String Function() + +icon: IconData? + +localizedHelpText: String Function()? + +enabled: bool + +onSelected: void Function(BuildContext, WidgetRef)? + +title: String + +helpText: String? - - - +CheckmarkTask toTask() - +InterventionTaskFormData copy() + + + +void onClick() - - - - - + + + - - - IFormDataWithSchedule + + + String Function() - - - +instanceId: String - +isTimeLocked: bool - +timeLockStart: StudyUTimeOfDay? - +timeLockEnd: StudyUTimeOfDay? - +hasReminder: bool - +reminderTime: StudyUTimeOfDay? + + + + + + + + String Function()? - - - +Schedule toSchedule() + + + + + + + + void Function(BuildContext, WidgetRef)? - - - - - + + + + + - - - InterventionPreview + + + GoRouterDrawerEntry - - - +routeArgs: InterventionFormRouteArgs + + + +intent: RoutingIntent - - - +Widget build() + + + +void onClick() - - - - - - - - InterventionFormRouteArgs - - + + + + - - - +interventionId: String + + + AppDrawer - - - - - - - - ConsumerWidget + + + +title: String + +width: int + +leftPaddingEntries: double + +logoPaddingVertical: double + +logoPaddingHorizontal: double + +logoMaxHeight: double + +logoSectionMinHeight: double + +logoSectionMaxHeight: double - - - - + + + + + - - - StudyFormValidationSet + + + DashboardController - - - +index: int - <static>+values: List<StudyFormValidationSet> + + + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +userRepository: IUserRepository + +router: GoRouter + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + +searchController: SearchController - - - - - - - - - - StudyInfoFormData + + + -dynamic _subscribeStudies() + +dynamic setSearchText() + +dynamic setStudiesFilter() + +dynamic onSelectStudy() + +dynamic onClickNewStudy() + +dynamic pinStudy() + +dynamic pinOffStudy() + +void filterStudies() + +void sortStudies() + +bool isPinned() + +List<ModelAction<dynamic>> availableActions() + +void dispose() - - - +title: String - +description: String? - +iconName: String - +contactInfoFormData: StudyContactInfoFormData - +id: String - - + + + + - - - +Study apply() - +StudyInfoFormData copy() + + + StreamSubscription - - - - - + + + + + - - - StudyContactInfoFormData + + + StudiesTable - - - +organization: String? - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String? - +website: String? - +phone: String? - +additionalInfo: String? - +id: String + + + +studies: List<Study> + +onSelect: void Function(Study) + +getActions: List<ModelAction<dynamic>> Function(Study) + +emptyWidget: Widget + +pinnedStudies: Iterable<String> + +dashboardController: DashboardController + +pinnedPredicates: int Function(Study, Study) + -_sortColumns: List<int Function(Study, Study)?> - - - +Study apply() - +StudyInfoFormData copy() + + + +Widget build() + -List<Widget> _buildRow() - - - - - - - - StudyDesignInfoFormView - - + + + - - - +Widget build() + + + void Function(Study) - - - - + + + - - - StudyDesignMeasurementsFormView + + + List<ModelAction<dynamic>> Function(Study) - - - +Widget build() + + + + + + + + int Function(Study, Study) - - - - - + + + + + - - - SurveyPreview + + + DashboardScaffold - - - +routeArgs: MeasurementFormRouteArgs + + + +body: Widget - - - +Widget build() + + + +Widget build() - - - - + + + + - - - MeasurementFormRouteArgs + + + StudiesFilter - - - +measurementId: String + + + +index: int + <static>+values: List<StudiesFilter> - - - - + + + + - - - MeasurementSurveyFormView + + + DashboardScreen - - - +formViewModel: MeasurementSurveyFormViewModel + + + +filter: StudiesFilter? - - - - - - - - - MeasurementSurveyFormViewModel - - + + + + - - - +study: Study - +measurementIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +surveyTitleControl: FormControl<String> - +surveyIntroTextControl: FormControl<String> - +surveyOutroTextControl: FormControl<String> - +form: FormGroup - +measurementId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneQuestion: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> + + + StudyMonitorScreen - - - +void setControlsFrom() - +MeasurementSurveyFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() - +SurveyQuestionFormRouteArgs buildFormRouteArgs() - +MeasurementSurveyFormViewModel createDuplicate() + + + +Widget build() - - - - - + + + + + - - - MeasurementSurveyFormData + + + StudyPageWidget - - - +measurementId: String - +title: String - +introText: String? - +outroText: String? - +questionnaireFormData: QuestionnaireFormData - <static>+kDefaultTitle: String - +id: String + + + +studyId: String - - - +QuestionnaireTask toQuestionnaireTask() - +MeasurementSurveyFormData copy() + + + +Widget? banner() - - - - - + + + + + - - - MeasurementsFormData + + + CustomFormControl - - - +surveyMeasurements: List<MeasurementSurveyFormData> - +id: String + + + -_onValueChangedDebouncer: Debouncer? + -_onStatusChangedDebouncer: Debouncer? + +onValueChanged: void Function(T?)? + +onStatusChanged: void Function(ControlStatus)? + +onStatusChangedDebounceTime: int? + +onValueChangedDebounceTime: int? - - - +Study apply() - +MeasurementsFormData copy() + + + +void dispose() - - - - - - - - - StudyFormScaffold - - + + + + + - - - +studyId: String - +formViewModelBuilder: T Function(WidgetRef) - +formViewBuilder: Widget Function(T) + + + Debouncer - - - +Widget build() + + + +leading: bool + +cancelUncompleted: bool + -_uncompletedFutureOperation: CancelableOperation<dynamic>? - - - - - - - - T Function(WidgetRef) + + + +dynamic call() - - - - - - - Widget Function(T) + + + + + + + void Function(T?)? - - - + + + - - - StudyUTimeOfDay + + + void Function(ControlStatus)? - - - - - + + + - - - ScheduleControls + + + FormControl - - - +formViewModel: WithScheduleControls - - + + + + - - - +Widget build() - -List<FormTableRow> _conditionalTimeRestrictions() + + + FormInvalidException - - - - + + + + - - - SurveyQuestionType + + + FormConfigException - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType + + + +message: String? - - - - - - - - - QuestionFormData - - + + + + - - - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> - +questionId: String - +questionText: String - +questionInfoText: String? - +questionType: SurveyQuestionType - +responseOptionsValidity: Map<dynamic, bool> - +responseOptions: List<dynamic> - +id: String + + + IFormViewModelDelegate - - - +Question<dynamic> toQuestion() - +EligibilityCriterion toEligibilityCriterion() - +Answer<dynamic> constructAnswerFor() - +dynamic setResponseOptionsValidityFrom() - +QuestionFormData copy() + + + +dynamic onSave() + +void onCancel() - - - - - - - - - ChoiceQuestionFormData - - + + + + - - - +isMultipleChoice: bool - +answerOptions: List<String> - +responseOptions: List<String> + + + IFormGroupController - - - +Question<dynamic> toQuestion() - +QuestionFormData copy() - -Choice _buildChoiceForValue() - +Answer<dynamic> constructAnswerFor() + + + +form: FormGroup - - - - - + + + - - - BoolQuestionFormData + + + FormGroup - - - <static>+kResponseOptions: Map<String, bool> - +responseOptions: List<String> + + + + + + + + + FormControlOption - - - +Question<dynamic> toQuestion() - +BoolQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +value: T + +label: String + +description: String? + +props: List<Object?> - - - - - + + + + + - - - ScaleQuestionFormData + + + FormViewModel - - - +minValue: double - +maxValue: double - +minLabel: String? - +maxLabel: String? - +midValues: List<double?> - +midLabels: List<String?> - +stepSize: double - +initialValue: double? - +minColor: Color? - +maxColor: Color? - +responseOptions: List<double> - +midAnnotations: List<Annotation> + + + -_formData: T? + -_formMode: FormMode + -_validationSet: FormValidationSetEnum? + +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? + +autosave: bool + -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> + -_immediateFormChildrenListenerDebouncer: Debouncer? + -_autosaveOperation: CancelableOperation<dynamic>? + -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> + +prevFormValue: Map<String, dynamic>? + <static>-_formKey: String + +formData: T? + +formMode: FormMode + +isReadonly: bool + +validationSet: FormValidationSetEnum? + +isDirty: bool + +title: String + +isValid: bool + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - - - +ScaleQuestion toQuestion() - +QuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + -dynamic _setFormData() + -dynamic _rememberDefaultControlValidators() + -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() + -dynamic _disableAllControls() + -dynamic _formModeUpdated() + -dynamic _restoreControlsFromFormData() + +void revalidate() + -void _applyValidationSet() + +void read() + +dynamic save() + +dynamic cancel() + +void enableAutosave() + +void listenToImmediateFormChildren() + +dynamic markFormGroupChanged() + +void dispose() + +void setControlsFrom() + +T buildFormData() + +void initControls() - - - - + + + + - - - IScaleQuestionFormViewModel + + + FormMode - - - +isMidValuesClearedInfoVisible: bool + + + +index: int + <static>+values: List<FormMode> + <static>+create: FormMode + <static>+readonly: FormMode + <static>+edit: FormMode - - - - + + + - - - ScaleQuestionFormView + + + FormValidationSetEnum - - - +formViewModel: QuestionFormViewModel + + + + + + + + CancelableOperation - - - - - + + + + - - - BoolQuestionFormView + + + ManagedFormViewModel - - - +formViewModel: QuestionFormViewModel + + + +ManagedFormViewModel<T> createDuplicate() - - - +Widget build() + + + + + + + + FormViewModelNotFoundException - - - - - + + + + + - - - ChoiceQuestionFormView + + + FormViewModelCollection - - - +formViewModel: QuestionFormViewModel + + + +formViewModels: List<T> + +formArray: FormArray<dynamic> + +stagedViewModels: List<T> + +retrievableViewModels: List<T> + +formData: List<D> - - - +Widget build() + + + +void add() + +T remove() + +T? findWhere() + +T? removeWhere() + +bool contains() + +void stage() + +T commit() + +void reset() + +void read() - - - - - - - - SurveyQuestionFormView - - + + + - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool + + + FormArray - - - - + + + + - - - StudyDesignReportsFormView + + + UnsavedChangesDialog - - - +Widget build() - -dynamic _showReportItemSidesheetWithArgs() + + + +Widget build() - - - - - + + + + + - - - ReportFormItemDelegate + + + IFormData - - - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +owner: ReportsFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + +id: String - - - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +IFormData copy() - - - - - + + + + + - - - ReportItemFormView + + + FormArrayTable - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: dynamic - +sectionTypeBodyBuilder: Widget Function(BuildContext) + + + +control: AbstractControl<dynamic> + +items: List<T> + +onSelectItem: void Function(T) + +getActionsAt: List<ModelAction<dynamic>> Function(T, int) + +onNewItem: void Function()? + +rowTitle: String Function(T) + +onNewItemLabel: String + +sectionTitle: String? + +sectionDescription: String? + +emptyIcon: IconData? + +emptyTitle: String? + +emptyDescription: String? + +sectionTitleDivider: bool? + +rowPrefix: Widget Function(BuildContext, T, int)? + +rowSuffix: Widget Function(BuildContext, T, int)? + +leadingWidget: Widget? + +itemsSectionPadding: EdgeInsets? + +hideLeadingTrailingWhenEmpty: bool + <static>+columns: List<StandardTableColumn> - - - +Widget build() - -dynamic _buildSectionText() - -dynamic _buildSectionTypeHeader() + + + +Widget build() + -List<Widget> _buildRow() + -Widget _newItemButton() - - - - - + + + - - - ReportItemFormViewModel + + + List<ModelAction<dynamic>> Function(T, int) - - - <static>+defaultSectionType: ReportSectionType - +sectionIdControl: FormControl<String> - +sectionTypeControl: FormControl<ReportSectionType> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +sectionControl: FormControl<ReportSection> - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>> - +temporalAggregationControl: FormControl<TemporalAggregationFormatted> - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted> - +alphaControl: FormControl<double> - -_controlsBySectionType: Map<ReportSectionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +sectionBaseControls: Map<String, AbstractControl<dynamic>> - +form: FormGroup - +sectionId: String - +sectionType: ReportSectionType - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>> - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>> - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>> - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +dataReferenceRequired: dynamic - +aggregationRequired: dynamic - +improvementDirectionRequired: dynamic - +alphaConfidenceRequired: dynamic - - + + + + - - - -List<FormControlValidation> _getValidationConfig() - +ReportItemFormData buildFormData() - +ReportItemFormViewModel createDuplicate() - +dynamic onSectionTypeChanged() - -void _updateFormControls() - +void setControlsFrom() + + + String Function(T) - - - + + + - - - Widget Function(BuildContext) + + + Widget Function(BuildContext, T, int)? - - - - - - - - - TemporalAggregationFormatted - - + + + + + - - - -_value: TemporalAggregation - <static>+values: List<TemporalAggregationFormatted> - +value: TemporalAggregation - +string: String - +icon: IconData? - +hashCode: int + + + FormControlValidation - - - +bool ==() - +String toString() - +String toJson() - <static>+TemporalAggregationFormatted fromJson() + + + +control: AbstractControl<dynamic> + +validators: List<Validator<dynamic>> + +asyncValidators: List<AsyncValidator<dynamic>>? + +validationMessages: Map<String, String Function(Object)> - - - - - - - - TemporalAggregation + + + +FormControlValidation merge() - - - - - + + + + + - - - ImprovementDirectionFormatted + + + InviteCodeFormViewModel - - - -_value: ImprovementDirection - <static>+values: List<ImprovementDirectionFormatted> - +value: ImprovementDirection - +string: String - +icon: IconData? - +hashCode: int + + + +study: Study + +inviteCodeRepository: IInviteCodeRepository + +codeControl: FormControl<String> + +codeControlValidationMessages: Map<String, String Function(dynamic)> + +isPreconfiguredScheduleControl: FormControl<bool> + +preconfiguredScheduleTypeControl: FormControl<PhaseSequence> + +interventionAControl: FormControl<String> + +interventionBControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +interventionControlOptions: List<FormControlOption<String>> + +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>> + +isPreconfiguredSchedule: bool + +preconfiguredSchedule: List<String>? - - - +bool ==() - +String toString() - +String toJson() - <static>+ImprovementDirectionFormatted fromJson() + + + +void initControls() + -dynamic _uniqueInviteCode() + +void regenerateCode() + -String _generateCode() + +StudyInvite buildFormData() + +void setControlsFrom() + +dynamic save() - - - + + + + + - - - ImprovementDirection + + + EnrolledBadge - - - - - - - + - - - ReportSectionType + + + +enrolledCount: int - - - +index: int - <static>+values: List<ReportSectionType> - <static>+average: ReportSectionType - <static>+linearRegression: ReportSectionType + + + +Widget build() - - - - - + + + + + - - - DataReferenceIdentifier + + + InviteCodeFormView - - - +hashCode: int + + + +formViewModel: InviteCodeFormViewModel - - - +bool ==() + + + +Widget build() + -List<FormTableRow> _conditionalInterventionRows() - - - + + + + - - - DataReference + + + StudyRecruitScreen - - - - - - - - - - DataReferenceEditor + + + +Widget build() + -Widget _inviteCodesSectionHeader() + -Widget _newInviteCodeButton() + -dynamic _onSelectInvite() - - - +formControl: FormControl<DataReferenceIdentifier<T>> - +availableTasks: List<Task> - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + + + + + + + + + + StudyRecruitController - - - +FormTableRow buildFormTableRow() - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + + + +inviteCodeRepository: IInviteCodeRepository + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - - - - - - - - ReactiveDropdownField + + + -dynamic _subscribeInvites() + +Intervention? getIntervention() + +int getParticipantCountForInvite() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void dispose() - - - - - + + + + + - - - AverageSectionFormView + + + StudyBaseController - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + +studyId: String + +studyRepository: IStudyRepository + +router: GoRouter + +studySubscription: StreamSubscription<WrappedModel<Study>>? - - - +Widget build() + + + +dynamic subscribeStudy() + +dynamic onStudySubscriptionUpdate() + +dynamic onStudySubscriptionError() + +void dispose() - - - - - + + + + + - - - LinearRegressionSectionFormView + + + StudyInvitesTable - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + +invites: List<StudyInvite> + +onSelect: void Function(StudyInvite) + +getActions: List<ModelAction<dynamic>> Function(StudyInvite) + +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite) + +getIntervention: Intervention? Function(String) + +getParticipantCountForInvite: int Function(StudyInvite) - - - +Widget build() + + + +Widget build() + -List<Widget> _buildRow() - - - - - + + + - - - ReportItemFormData + + + void Function(StudyInvite) - - - +isPrimary: bool - +section: ReportSection - +id: String + + + + + + + + List<ModelAction<dynamic>> Function(StudyInvite) - - - <static>+dynamic fromDomainModel() - +ReportItemFormData copy() + + + + + + + + Intervention? Function(String) - - - + + + - - - ReportSection + + + int Function(StudyInvite) - - - - - + + + + - - - ReportsFormData + + + AuthScaffold - - - +reportItems: List<ReportItemFormData> - +id: String + + + +body: Widget + +formKey: AuthFormKey + +leftContentMinWidth: double + +leftPanelMinWidth: double + +leftPanelPadding: EdgeInsets - - - +Study apply() - +ReportsFormData copy() + + + + + + + + + AuthFormKey + + + + + + +index: int + <static>+values: List<AuthFormKey> + <static>+login: AuthFormKey + <static>+signup: AuthFormKey + <static>+passwordForgot: AuthFormKey + <static>+passwordRecovery: AuthFormKey + <static>-_loginSubmit: AuthFormKey + <static>-_signupSubmit: AuthFormKey - - - - + + + + + - - - ReportStatus + + + SignupForm - - - +index: int - <static>+values: List<ReportStatus> - <static>+primary: ReportStatus - <static>+secondary: ReportStatus + + + +formKey: AuthFormKey + + + + + + +Widget build() + -dynamic _onClickTermsOfUse() + -dynamic _onClickPrivacyPolicy() - - - - - + + + + + - - - ReportBadge + + + PasswordRecoveryForm - - - +status: ReportStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + +formKey: AuthFormKey - - - +Widget build() + + + +Widget build() - - - - + + + + + - - - BadgeType + + + PasswordForgotForm - - - +index: int - <static>+values: List<BadgeType> - <static>+filled: BadgeType - <static>+outlined: BadgeType - <static>+outlineFill: BadgeType - <static>+plain: BadgeType + + + +formKey: AuthFormKey + + + + + + +Widget build() - - - - + + + + + - - - AppStatus + + + AuthFormController - - - +index: int - <static>+values: List<AppStatus> - <static>+initializing: AppStatus - <static>+initialized: AppStatus + + + +authRepository: IAuthRepository + +sharedPreferences: SharedPreferences + +notificationService: INotificationService + +router: GoRouter + +emailControl: FormControl<String> + +passwordControl: FormControl<String> + +passwordConfirmationControl: FormControl<String> + +rememberMeControl: FormControl<bool> + +termsOfServiceControl: FormControl<bool> + <static>+authValidationMessages: Map<String, String Function(dynamic)> + +loginForm: FormGroup + +signupForm: FormGroup + +passwordForgotForm: FormGroup + +passwordRecoveryForm: FormGroup + +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> + -_formKey: AuthFormKey + +shouldRemember: bool + +formKey: AuthFormKey + +form: FormGroup + + + + + + -dynamic _onChangeFormKey() + +dynamic resetControlsFor() + -dynamic _forceValidationMessages() + +dynamic signUp() + -dynamic _signUp() + +dynamic signIn() + -dynamic _signInWith() + +dynamic signOut() + +dynamic resetPasswordForEmail() + +dynamic sendPasswordResetLink() + +dynamic recoverPassword() + +dynamic updateUser() + -void _setRememberMe() + -void _delRememberMe() + -void _initRememberMe() - - - - + + + + - - - PublishDialog + + + EmailTextField - - - +Widget build() + + + +labelText: String + +hintText: String? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - - + + + + - - - PublishConfirmationDialog + + + PasswordTextField - - - +Widget build() + + + +labelText: String + +hintText: String? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - - + + + + - - - PublishSuccessDialog + + + StudyUJobsToBeDone - - - +Widget build() + + + +Widget build() - - - - + + + + + - - - StudyAnalyzeScreen + + + LoginForm - - - +Widget? banner() - +Widget build() + + + +formKey: AuthFormKey + + + + + + +Widget build() - - + + - + StudyAnalyzeController - + +dynamic onExport() - - - - - - - - - StudyParticipationBadge - - + + + + - - - +participation: Participation - +type: BadgeType - +showPrefixIcon: bool + + + StudyAnalyzeScreen - - - +Widget build() + + + +Widget? banner() + +Widget build() - - - - - - - - - RouteInformation - - + + + + - - - +route: String? - +extra: String? - +cmd: String? - +data: String? + + + PublishDialog - - - +String toString() + + + +Widget build() - - - - - - - - - PlatformController - - + + + + - - - +studyId: String - +baseSrc: String - +previewSrc: String - +routeInformation: RouteInformation - +frameWidget: Widget + + + PublishSuccessDialog - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void listen() - +void send() - +void openNewPage() + + + +Widget build() - - - - - - - - - WebController - - + + + + - - - +iFrameElement: IFrameElement + + + PublishConfirmationDialog - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void openNewPage() - +void listen() - +void send() + + + +Widget build() - - - + + + - - - IFrameElement + + + App - - - - - - - - MobileController - - + + + - - - +void openNewPage() - +void refresh() - +void registerViews() - +void listen() - +void send() - +void navigate() - +void activate() - +void generateUrl() + + + AppContent - - + + - + IStudyAppBarViewModel - + +isSyncIndicatorVisible: bool +isStatusBadgeVisible: bool @@ -11806,16 +11802,16 @@ - - + + - + IStudyStatusBadgeViewModel - + +studyParticipation: Participation? +studyStatus: StudyStatus? @@ -11825,16 +11821,16 @@ - - + + - + IStudyNavViewModel - + +isEditTabEnabled: bool +isTestTabEnabled: bool @@ -11848,16 +11844,16 @@ - - + + - + StudyScaffold - + +studyId: String +tabs: List<NavbarTab>? @@ -11876,89 +11872,69 @@ - - - - - - - - NavbarTab - - - - - - +title: String - +intent: RoutingIntent? - +index: int - +enabled: bool - - - - - - - - + + + + - - - SingleColumnLayoutType + + + PreviewFrame - - - +index: int - <static>+values: List<SingleColumnLayoutType> - <static>+boundedWide: SingleColumnLayoutType - <static>+boundedNarrow: SingleColumnLayoutType - <static>+stretched: SingleColumnLayoutType - <static>+split: SingleColumnLayoutType + + + +studyId: String + +routeArgs: StudyFormRouteArgs? + +route: String? - - - - - + + + + + - - - StudyController + + + StudyParticipationBadge - - - +notificationService: INotificationService - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? - +studyActions: List<ModelAction<dynamic>> + + + +participation: Participation + +type: BadgeType + +showPrefixIcon: bool - - - +dynamic syncStudyStatus() - +dynamic onStudySubscriptionUpdate() - -dynamic _redirectNewToActualStudyID() - +dynamic publishStudy() - +void onChangeStudyParticipation() - +void onAddParticipants() - +void onSettingsPressed() - +void dispose() + + + +Widget build() + + + + + + + + + + + Participation - + - + StudyStatus @@ -11967,17 +11943,17 @@ - - - + + + - + StudyStatusBadge - + +participation: Participation? +status: StudyStatus? @@ -11987,67 +11963,81 @@ - + +Widget build() - - - - + + + + + - - - StudyTestController + + + FrameControlsWidget - - - +authRepository: IAuthRepository - +languageCode: String + + + +onRefresh: void Function()? + +onOpenNewTab: void Function()? + +enabled: bool + + + + + + +Widget build() - - - - + + + + + - - - TestAppRoutes + + + StudyTestScreen - - - <static>+studyOverview: String - <static>+eligibility: String - <static>+intervention: String - <static>+consent: String - <static>+journey: String - <static>+dashboard: String + + + +previewRoute: String? + + + + + + +Widget build() + +Widget? banner() + +dynamic load() + +dynamic save() + +dynamic showHelp() - - + + - + StudyNav - + <static>+dynamic tabs() <static>+dynamic edit() @@ -12061,16 +12051,16 @@ - - + + - + StudyDesignNav - + <static>+dynamic tabs() <static>+dynamic info() @@ -12082,203 +12072,212 @@ - - - - - - - - StudySettingsDialog - - - - - - +Widget build() - - - - - - - - - + + + + + - - - StudySettingsFormViewModel + + + RouteInformation - - - +study: AsyncValue<Study> - +studyRepository: IStudyRepository - <static>+defaultPublishedToRegistry: bool - <static>+defaultPublishedToRegistryResults: bool - +isPublishedToRegistryControl: FormControl<bool> - +isPublishedToRegistryResultsControl: FormControl<bool> - +form: FormGroup - +titles: Map<FormMode, String> + + + +route: String? + +extra: String? + +cmd: String? + +data: String? - - - +void setControlsFrom() - +Study buildFormData() - +dynamic keepControlsSynced() - +dynamic save() - +dynamic setLaunchDefaults() + + + +String toString() - - - + + + + + - - - AsyncValue + + + PlatformController - - - - - - - - - IWithBanner + + + +studyId: String + +baseSrc: String + +previewSrc: String + +routeInformation: RouteInformation + +frameWidget: Widget - - - +Widget? banner() + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void listen() + +void send() + +void openNewPage() - - - - - + + + + + - - - StudyTestScreen + + + WebController - - - +previewRoute: String? + + + +iFrameElement: IFrameElement - - - +Widget build() - +Widget? banner() - +dynamic load() - +dynamic save() - +dynamic showHelp() + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void openNewPage() + +void listen() + +void send() - - - - - + + + - - - FrameControlsWidget + + + IFrameElement - - - +onRefresh: void Function()? - +onOpenNewTab: void Function()? - +enabled: bool + + + + + + + + + MobileController - - - +Widget build() + + + +void openNewPage() + +void refresh() + +void registerViews() + +void listen() + +void send() + +void navigate() + +void activate() + +void generateUrl() - - - - + + + + + - - - PreviewFrame + + + StudySettingsFormViewModel - - - +studyId: String - +routeArgs: StudyFormRouteArgs? - +route: String? + + + +study: AsyncValue<Study> + +studyRepository: IStudyRepository + <static>+defaultPublishedToRegistry: bool + <static>+defaultPublishedToRegistryResults: bool + +isPublishedToRegistryControl: FormControl<bool> + +isPublishedToRegistryResultsControl: FormControl<bool> + +form: FormGroup + +titles: Map<FormMode, String> + + + + + + +void setControlsFrom() + +Study buildFormData() + +dynamic keepControlsSynced() + +dynamic save() + +dynamic setLaunchDefaults() - - - - + + + + - - - StudyFormRouteArgs + + + StudySettingsDialog - - - +studyId: String + + + +Widget build() - - - + + + - + WebFrame - + +previewSrc: String +studyId: String - + +Widget build() @@ -12287,16 +12286,16 @@ - - + + - + DisabledFrame - + +Widget build() @@ -12305,17 +12304,17 @@ - - - + + + - + PhoneContainer - + <static>+defaultWidth: double <static>+defaultHeight: double @@ -12329,7 +12328,7 @@ - + +Widget build() @@ -12338,16 +12337,16 @@ - - + + - + MobileFrame - + +Widget build() @@ -12356,3004 +12355,3391 @@ - - + + - + DesktopFrame - + +Widget build() - - - - + + + + - - - StudiesFilter + + + StudyTestController - - - +index: int - <static>+values: List<StudiesFilter> + + + +authRepository: IAuthRepository + +languageCode: String - - - - - + + + + + - - - DashboardScaffold + + + StudyController - - - +body: Widget + + + +notificationService: INotificationService + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? + +studyActions: List<ModelAction<dynamic>> - - - +Widget build() + + + +dynamic syncStudyStatus() + +dynamic onStudySubscriptionUpdate() + -dynamic _redirectNewToActualStudyID() + +dynamic publishStudy() + +void onChangeStudyParticipation() + +void onAddParticipants() + +void onSettingsPressed() + +void dispose() - - - - - + + + + - - - StudiesTable + + + TestAppRoutes - - - +studies: List<Study> - +onSelect: void Function(Study) - +getActions: List<ModelAction<dynamic>> Function(Study) - +emptyWidget: Widget + + + <static>+studyOverview: String + <static>+eligibility: String + <static>+intervention: String + <static>+consent: String + <static>+journey: String + <static>+dashboard: String - - - +Widget build() - -List<Widget> _buildRow() + + + + + + + + + StudyDesignInfoFormView + + + + + + +Widget build() - - - + + + + - - - void Function(Study) + + + StudyDesignPageWidget + + + + + + +Widget? banner() - - - + + + + + - - - List<ModelAction<dynamic>> Function(Study) + + + StudyInfoFormViewModel + + + + + + +study: Study + +titleControl: FormControl<String> + +iconControl: FormControl<IconOption> + +descriptionControl: FormControl<String> + +organizationControl: FormControl<String> + +reviewBoardControl: FormControl<String> + +reviewBoardNumberControl: FormControl<String> + +researchersControl: FormControl<String> + +emailControl: FormControl<String> + +websiteControl: FormControl<String> + +phoneControl: FormControl<String> + +additionalInfoControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +iconRequired: dynamic + +organizationRequired: dynamic + +reviewBoardRequired: dynamic + +reviewBoardNumberRequired: dynamic + +researchersRequired: dynamic + +emailRequired: dynamic + +phoneRequired: dynamic + +emailFormat: dynamic + +websiteFormat: dynamic + + + + + + +void setControlsFrom() + +StudyInfoFormData buildFormData() + + + + + + + + + + + + + StudyInfoFormData + + + + + + +title: String + +description: String? + +iconName: String + +contactInfoFormData: StudyContactInfoFormData + +id: String + + + + + + +Study apply() + +StudyInfoFormData copy() + + + + + + + + + + + + + StudyContactInfoFormData + + + + + + +organization: String? + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String? + +website: String? + +phone: String? + +additionalInfo: String? + +id: String + + + + + + +Study apply() + +StudyInfoFormData copy() + + + + + + + + + + + + IStudyFormData + + + + + + +Study apply() + + + + + + + + + + + + + StudyFormScaffold + + + + + + +studyId: String + +formViewModelBuilder: T Function(WidgetRef) + +formViewBuilder: Widget Function(T) + + + + + + +Widget build() + + + + + + + + + + + T Function(WidgetRef) + + + + + + + + + + + + StudyFormValidationSet + + + + + + +index: int + <static>+values: List<StudyFormValidationSet> - - - - + + + + - - - DashboardScreen + + + StudyDesignMeasurementsFormView - - - +filter: StudiesFilter? + + + +Widget build() - - - - - + + + + + - - - DashboardController + + + MeasurementsFormViewModel - - - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +router: GoRouter - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + + + +study: Study + +router: GoRouter + +measurementsArray: FormArray<dynamic> + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> + +form: FormGroup + +measurementViewModels: List<MeasurementSurveyFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +measurementRequired: dynamic + +titles: Map<FormMode, String> - - - -dynamic _subscribeStudies() - +dynamic setStudiesFilter() - +dynamic onSelectStudy() - +dynamic onClickNewStudy() - +List<ModelAction<dynamic>> availableActions() - +void dispose() + + + +void read() + +void setControlsFrom() + +MeasurementsFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +MeasurementSurveyFormViewModel provide() + +void onCancel() + +dynamic onSave() - - - - + + + + - - - StudyMonitorScreen + + + IListActionProvider - - - +Widget build() + + + +void onSelectItem() + +void onNewItem() - - - - + + + + - - - AccountSettingsDialog + + + IProviderArgsResolver - - - +Widget build() + + + +R provide() - - - + + + + + - - - App + + + MeasurementsFormData - - - - + + + +surveyMeasurements: List<MeasurementSurveyFormData> + +id: String + + - - - AppContent + + + +Study apply() + +MeasurementsFormData copy() - - - - + + + + + - - - Assets + + + MeasurementSurveyFormViewModel - - - <static>+logoWide: String + + + +study: Study + +measurementIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +surveyTitleControl: FormControl<String> + +surveyIntroTextControl: FormControl<String> + +surveyOutroTextControl: FormControl<String> + +form: FormGroup + +measurementId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneQuestion: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - - - - - - ResultTypes + + + +void setControlsFrom() + +MeasurementSurveyFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() + +SurveyQuestionFormRouteArgs buildFormRouteArgs() + +MeasurementSurveyFormViewModel createDuplicate() - - - - + + + + + - - - MeasurementResultTypes + + + WithQuestionnaireControls - - - <static>+questionnaire: String - <static>+values: List<String> + + + +questionsArray: FormArray<dynamic> + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> + +questionnaireControls: Map<String, FormArray<dynamic>> + +propagateOnSave: bool + +questionModels: List<Q> + +questionTitles: Map<FormMode, String Function()> + + + + + + +void setQuestionnaireControlsFrom() + +QuestionnaireFormData buildQuestionnaireFormData() + +void read() + +void onCancel() + +dynamic onSave() + +Q provide() + +Q provideQuestionFormViewModel() - - - - + + + + + - - - InterventionResultTypes + + + WithScheduleControls - - - <static>+checkmarkTask: String - <static>+values: List<String> + + + +isTimeRestrictedControl: FormControl<bool> + +instanceID: FormControl<String> + +restrictedTimeStartControl: FormControl<Time> + +restrictedTimeStartPickerControl: FormControl<TimeOfDay> + +restrictedTimeEndControl: FormControl<Time> + +restrictedTimeEndPickerControl: FormControl<TimeOfDay> + +hasReminderControl: FormControl<bool> + +reminderTimeControl: FormControl<Time> + +reminderTimePickerControl: FormControl<TimeOfDay> + -_reminderControlStream: StreamSubscription<dynamic>? + +scheduleFormControls: Map<String, FormControl<Object>> + +hasReminder: bool + +isTimeRestricted: bool + +timeRestriction: List<Time>? + + + + + + +void setScheduleControlsFrom() + -dynamic _initReminderControl() - - - - + + + + + - - - StudyExportData + + + MeasurementSurveyFormData - - - +study: Study - +measurementsData: List<Map<String, dynamic>> - +interventionsData: List<Map<String, dynamic>> - +isEmpty: bool + + + +measurementId: String + +title: String + +introText: String? + +outroText: String? + +questionnaireFormData: QuestionnaireFormData + <static>+kDefaultTitle: String + +id: String + + + + + + +QuestionnaireTask toQuestionnaireTask() + +MeasurementSurveyFormData copy() - - - - - + + + + + - - - StudyTemplates + + + QuestionnaireFormData - - - <static>+kUnnamedStudyTitle: String + + + +questionsData: List<QuestionFormData>? + +id: String - - - <static>+Study emptyDraft() + + + +StudyUQuestionnaire toQuestionnaire() + +List<EligibilityCriterion> toEligibilityCriteria() + +QuestionnaireFormData copy() - - - - + + + + + - - - StudyActionType + + + IFormDataWithSchedule + + + + + + +instanceId: String + +isTimeLocked: bool + +timeLockStart: StudyUTimeOfDay? + +timeLockEnd: StudyUTimeOfDay? + +hasReminder: bool + +reminderTime: StudyUTimeOfDay? - - - +index: int - <static>+values: List<StudyActionType> - <static>+edit: StudyActionType - <static>+duplicate: StudyActionType - <static>+duplicateDraft: StudyActionType - <static>+addCollaborator: StudyActionType - <static>+export: StudyActionType - <static>+delete: StudyActionType + + + +Schedule toSchedule() - - - + + + + + - - - StudyLaunched + + + SurveyPreview - - - - - - - - - ModelEvent + + + +routeArgs: MeasurementFormRouteArgs - - - +modelId: String - +model: T + + + +Widget build() - - - - - - - - - ModelRepository - - + + + + - - - +delegate: IModelRepositoryDelegate<T> - -_allModelsStreamController: BehaviorSubject<List<WrappedModel<T>>> - -_allModelEventsStreamController: BehaviorSubject<ModelEvent<T>> - +modelStreamControllers: Map<String, BehaviorSubject<WrappedModel<T>>> - +modelEventsStreamControllers: Map<String, BehaviorSubject<ModelEvent<T>>> - -_allModels: Map<String, WrappedModel<T>> + + + MeasurementSurveyFormView - - - +WrappedModel<T>? get() - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +dynamic duplicateAndSave() - +dynamic duplicateAndSaveFromRemote() - +Stream<List<WrappedModel<T>>> watchAll() - +Stream<WrappedModel<T>> watch() - +Stream<ModelEvent<T>> watchAllChanges() - +Stream<ModelEvent<T>> watchChanges() - -dynamic _buildModelSpecificController() - +dynamic ensurePersisted() - +WrappedModel<T> upsertLocally() - +List<WrappedModel<T>> upsertAllLocally() - +dynamic emitUpdate() - +dynamic emitModelEvent() - +dynamic emitError() - +void dispose() - +List<ModelAction<dynamic>> availableActions() + + + +formViewModel: MeasurementSurveyFormViewModel - - - - - + + + + + - - - StudyRepository + + + ReportsFormViewModel - - - +apiClient: StudyUApi - +authRepository: IAuthRepository - +ref: ProviderRef<dynamic> + + + +study: Study + +router: GoRouter + +reportItemDelegate: ReportFormItemDelegate + +reportItemArray: FormArray<dynamic> + +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +form: FormGroup + +reportItemModels: List<ReportItemFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + +canTestConsent: bool - - - +String getKey() - +dynamic deleteParticipants() - +dynamic launch() - +List<ModelAction<dynamic>> availableActions() + + + +void setControlsFrom() + +ReportsFormData buildFormData() + +void read() + +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() + +ReportItemFormRouteArgs buildReportItemFormRouteArgs() + +dynamic testReport() + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() - - - - + + + + + - - - StudyUApi + + + ReportFormItemDelegate - - - +dynamic saveStudy() - +dynamic fetchStudy() - +dynamic getUserStudies() - +dynamic deleteStudy() - +dynamic saveStudyInvite() - +dynamic fetchStudyInvite() - +dynamic deleteStudyInvite() - +dynamic deleteParticipants() - +dynamic fetchAppConfig() + + + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +owner: ReportsFormViewModel + +propagateOnSave: bool + +validationSet: dynamic - - - - - - - - ProviderRef + + + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - - - + + + + + - - - StudyRepositoryDelegate + + + ReportItemFormView - - - +apiClient: StudyUApi - +authRepository: IAuthRepository + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: dynamic + +sectionTypeBodyBuilder: Widget Function(BuildContext) - - - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +dynamic onError() - +Study createNewInstance() - +Study createDuplicate() + + + +Widget build() + -dynamic _buildSectionText() + -dynamic _buildSectionTypeHeader() - - - - + + + + + - - - IModelRepositoryDelegate + + + ReportItemFormViewModel - - - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +T createNewInstance() - +T createDuplicate() - +dynamic onError() + + + <static>+defaultSectionType: ReportSectionType + +sectionIdControl: FormControl<String> + +sectionTypeControl: FormControl<ReportSectionType> + +titleControl: FormControl<String> + +descriptionControl: FormControl<String> + +sectionControl: FormControl<ReportSection> + +dataReferenceControl: FormControl<DataReferenceIdentifier<num>> + +temporalAggregationControl: FormControl<TemporalAggregationFormatted> + +improvementDirectionControl: FormControl<ImprovementDirectionFormatted> + +alphaControl: FormControl<double> + -_controlsBySectionType: Map<ReportSectionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +sectionBaseControls: Map<String, AbstractControl<dynamic>> + +form: FormGroup + +sectionId: String + +sectionType: ReportSectionType + <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>> + <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>> + <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>> + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +dataReferenceRequired: dynamic + +aggregationRequired: dynamic + +improvementDirectionRequired: dynamic + +alphaConfidenceRequired: dynamic - - - - - - - - IsFetched + + + -List<FormControlValidation> _getValidationConfig() + +ReportItemFormData buildFormData() + +ReportItemFormViewModel createDuplicate() + +dynamic onSectionTypeChanged() + -void _updateFormControls() + +void setControlsFrom() - - - + + + + + - - - IsSaving + + + LinearRegressionSectionFormView - - - - - - - - IsSaved + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - - - - - - IsDeleted + + + +Widget build() - - - - + + + + + - - - IAppRepository + + + DataReferenceIdentifier - - - +dynamic fetchAppConfig() - +void dispose() + + + +hashCode: int - - - - - - - - - - AppRepository + + + +bool ==() - - - +apiClient: StudyUApi - - + + + + - - - +dynamic fetchAppConfig() - +void dispose() + + + DataReference - - - - - + + + + + - - - WrappedModel + + + DataReferenceEditor - - - -_model: T - +asyncValue: AsyncValue<T> - +isLocalOnly: bool - +isDirty: bool - +isDeleted: bool - +lastSaved: DateTime? - +lastFetched: DateTime? - +lastUpdated: DateTime? - +model: T + + + +formControl: FormControl<DataReferenceIdentifier<T>> + +availableTasks: List<Task> + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - +dynamic markWithError() - +dynamic markAsLoading() - +dynamic markAsFetched() - +dynamic markAsSaved() + + + +FormTableRow buildFormTableRow() + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - + + + - - - ModelRepositoryException + + + ReactiveDropdownField - - - + + + + + - - - ModelNotFoundException + + + TemporalAggregationFormatted - - - - - - - - - IModelRepository + + + -_value: TemporalAggregation + <static>+values: List<TemporalAggregationFormatted> + +value: TemporalAggregation + +string: String + +icon: IconData? + +hashCode: int - - - +String getKey() - +WrappedModel<T>? get() - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +dynamic duplicateAndSave() - +dynamic duplicateAndSaveFromRemote() - +Stream<WrappedModel<T>> watch() - +Stream<List<WrappedModel<T>>> watchAll() - +Stream<ModelEvent<T>> watchChanges() - +Stream<ModelEvent<T>> watchAllChanges() - +dynamic ensurePersisted() - +void dispose() + + + +bool ==() + +String toString() + +String toJson() + <static>+TemporalAggregationFormatted fromJson() - - - + + + - - - APIException + + + TemporalAggregation - - - + + + + + - - - StudyNotFoundException + + + ImprovementDirectionFormatted - - - - + + + -_value: ImprovementDirection + <static>+values: List<ImprovementDirectionFormatted> + +value: ImprovementDirection + +string: String + +icon: IconData? + +hashCode: int + + - - - MeasurementNotFoundException + + + +bool ==() + +String toString() + +String toJson() + <static>+ImprovementDirectionFormatted fromJson() - - - + + + - - - QuestionNotFoundException + + + ImprovementDirection - - - + + + + - - - ConsentItemNotFoundException + + + ReportSectionType - - - - - - - - InterventionNotFoundException + + + +index: int + <static>+values: List<ReportSectionType> + <static>+average: ReportSectionType + <static>+linearRegression: ReportSectionType - - - + + + + + - - - InterventionTaskNotFoundException + + + AverageSectionFormView - - - - + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> + + - - - ReportNotFoundException + + + +Widget build() - - - + + + + + - - - ReportSectionNotFoundException + + + ReportItemFormData - - - - + + + +isPrimary: bool + +section: ReportSection + +id: String + + - - - StudyInviteNotFoundException + + + <static>+dynamic fromDomainModel() + +ReportItemFormData copy() - - - - - + + + - - - StudyUApiClient + + + ReportSection - - - +supabaseClient: SupabaseClient - <static>+studyColumns: List<String> - <static>+studyWithParticipantActivityColumns: List<String> - +testDelayMilliseconds: int - - + + + + + + - - - +dynamic deleteParticipants() - +dynamic getUserStudies() - +dynamic fetchStudy() - +dynamic deleteStudy() - +dynamic saveStudy() - +dynamic fetchStudyInvite() - +dynamic saveStudyInvite() - +dynamic deleteStudyInvite() - +dynamic fetchAppConfig() - -dynamic _awaitGuarded() - -dynamic _apiException() - -dynamic _testDelay() + + + ReportsFormData - - - - + + + +reportItems: List<ReportItemFormData> + +id: String + + - - - SupabaseClient + + + +Study apply() + +ReportsFormData copy() - - - - + + + + - - - SupabaseClientDependant + + + ReportStatus - - - +supabaseClient: SupabaseClient + + + +index: int + <static>+values: List<ReportStatus> + <static>+primary: ReportStatus + <static>+secondary: ReportStatus - - - - + + + + - - - SupabaseQueryMixin + + + StudyDesignReportsFormView - - - +dynamic deleteAll() - +dynamic getAll() - +dynamic getById() - +dynamic getByColumn() - +List<T> deserializeList() - +T deserializeObject() + + + +Widget build() + -dynamic _showReportItemSidesheetWithArgs() - - - + + + + + - - - User + + + ReportBadge - - - - + + + +status: ReportStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool + + - - - Session + + + +Widget build() - - - - - + + + + - - - AuthRepository + + + StudyDesignEnrollmentFormView - - - <static>+PERSIST_SESSION_KEY: String - +supabaseClient: SupabaseClient - +sharedPreferences: SharedPreferences - +allowPasswordReset: bool - +authClient: GoTrueClient - +session: Session? - +currentUser: User? - +isLoggedIn: bool + + + +Widget build() + -dynamic _showScreenerQuestionSidesheetWithArgs() + -dynamic _showConsentItemSidesheetWithArgs() - - - -void _registerAuthListener() - +dynamic signUp() - +dynamic signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic updateUser() - -dynamic _persistSession() - -dynamic _resetPersistedSession() - -dynamic _recoverSession() - +void dispose() - +dynamic onAppStart() + + + + + + + + + + ConsentItemFormData - - - - + + + +consentId: String + +title: String + +description: String + +iconName: String? + +id: String + + - - - GoTrueClient + + + +ConsentItem toConsentItem() + +ConsentItemFormData copy() - - - - - + + + + + - - - InviteCodeRepository + + + EnrollmentFormData - - - +studyId: String - +ref: ProviderRef<dynamic> - +apiClient: StudyUApi - +authRepository: IAuthRepository - +studyRepository: IStudyRepository - +study: Study + + + <static>+kDefaultEnrollmentType: Participation + +enrollmentType: Participation + +questionnaireFormData: QuestionnaireFormData + +consentItemsFormData: List<ConsentItemFormData>? + +id: String - - - +String getKey() - +dynamic isCodeAlreadyUsed() - +List<ModelAction<dynamic>> availableActions() - +dynamic emitUpdate() + + + +Study apply() + +EnrollmentFormData copy() - - - - - + + + + + - - - InviteCodeRepositoryDelegate + + + ConsentItemFormViewModel - - - +study: Study - +apiClient: StudyUApi - +studyRepository: IStudyRepository + + + +consentIdControl: FormControl<String> + +titleControl: FormControl<String> + +descriptionControl: FormControl<String> + +iconControl: FormControl<IconOption> + +form: FormGroup + +consentId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +titles: Map<FormMode, String> - - - +dynamic fetch() - +dynamic fetchAll() - +dynamic save() - +dynamic delete() - +dynamic onError() - +StudyInvite createDuplicate() - +StudyInvite createNewInstance() + + + +void setControlsFrom() + +ConsentItemFormData buildFormData() + +ConsentItemFormViewModel createDuplicate() - - - - + + + + - - - SupabaseQueryError + + + IScreenerQuestionLogicFormViewModel - - - +statusCode: String? - +message: String - +details: dynamic + + + +isDirtyOptionsBannerVisible: bool - - - - + + + + + - - - GoRouteParamEnum + + + ScreenerQuestionLogicFormView - - - +String toRouteParam() - +String toShortString() + + + +formViewModel: ScreenerQuestionFormViewModel + + + + + + +Widget build() + -dynamic _buildInfoBanner() + -dynamic _buildAnswerOptionsLogicControls() + -List<Widget> _buildOptionLogicRow() - - - - + + + + + - - - RouterKeys + + + ScreenerQuestionFormViewModel - - - <static>+studyKey: ValueKey<String> - <static>+authKey: ValueKey<String> + + + <static>+defaultResponseOptionValidity: bool + +responseOptionsDisabledArray: FormArray<dynamic> + +responseOptionsLogicControls: FormArray<bool> + +responseOptionsLogicDescriptionControls: FormArray<String> + -_questionBaseControls: Map<String, AbstractControl<dynamic>> + +prevResponseOptionControls: List<AbstractControl<dynamic>> + +prevResponseOptionValues: List<dynamic> + +responseOptionsDisabledControls: List<AbstractControl<dynamic>> + +logicControlOptions: List<FormControlOption<bool>> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isDirtyOptionsBannerVisible: bool + + + + + + +dynamic onResponseOptionsChanged() + +void setControlsFrom() + +QuestionFormData buildFormData() + -List<FormControl<dynamic>> _copyFormControls() + -AbstractControl<dynamic>? _findAssociatedLogicControlFor() + -AbstractControl<dynamic>? _findAssociatedControlFor() + +ScreenerQuestionFormViewModel createDuplicate() - - - + + + + + - - - ValueKey + + + QuestionFormViewModel - - - - - - - - - RouteParams + + + <static>+defaultQuestionType: SurveyQuestionType + -_titles: Map<FormMode, String Function()>? + +questionIdControl: FormControl<String> + +questionTypeControl: FormControl<SurveyQuestionType> + +questionTextControl: FormControl<String> + +questionInfoTextControl: FormControl<String> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isMultipleChoiceControl: FormControl<bool> + +choiceResponseOptionsArray: FormArray<dynamic> + +customOptionsMin: int + +customOptionsMax: int + +customOptionsInitial: int + +boolResponseOptionsArray: FormArray<String> + <static>+kDefaultScaleMinValue: int + <static>+kDefaultScaleMaxValue: int + <static>+kNumMidValueControls: int + <static>+kMidValueDebounceMilliseconds: int + +scaleMinValueControl: FormControl<int> + +scaleMaxValueControl: FormControl<int> + -_scaleRangeControl: FormControl<int> + +scaleMinLabelControl: FormControl<String> + +scaleMaxLabelControl: FormControl<String> + +scaleMidValueControls: FormArray<int> + +scaleMidLabelControls: FormArray<String?> + -_scaleResponseOptionsArray: FormArray<int> + +scaleMinColorControl: FormControl<SerializableColor> + +scaleMaxColorControl: FormControl<SerializableColor> + +prevMidValues: List<int?>? + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +form: FormGroup + +questionId: String + +questionType: SurveyQuestionType + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> + +answerOptionsArray: FormArray<dynamic> + +answerOptionsControls: List<AbstractControl<dynamic>> + +validAnswerOptions: List<String> + +boolOptions: List<AbstractControl<String>> + +scaleMinValue: int + +scaleMaxValue: int + +scaleRange: int + +scaleAllValueControls: List<AbstractControl<int>> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +questionTextRequired: dynamic + +numValidChoiceOptions: dynamic + +scaleRangeValid: dynamic + +titles: Map<FormMode, String> + +isAddOptionButtonVisible: bool + +isMidValuesClearedInfoVisible: bool - - - <static>+studiesFilter: String - <static>+studyId: String - <static>+measurementId: String - <static>+interventionId: String - <static>+testAppRoute: String + + + +String? scaleMidLabelAt() + -dynamic _onScaleRangeChanged() + -dynamic _applyInputFormatters() + -dynamic _updateScaleMidValueControls() + -List<FormControlValidation> _getValidationConfig() + +dynamic onQuestionTypeChanged() + +dynamic onResponseOptionsChanged() + -void _updateFormControls() + +void initControls() + +void setControlsFrom() + +QuestionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() + +QuestionFormViewModel createDuplicate() - - - - - + + + + + - - - RouterConf + + + EnrollmentFormViewModel - - - <static>+router: GoRouter - <static>+routes: List<GoRoute> - <static>+publicRoutes: List<GoRoute> - <static>+privateRoutes: List<GoRoute> + + + +study: Study + +router: GoRouter + +consentItemDelegate: EnrollmentFormConsentItemDelegate + +enrollmentTypeControl: FormControl<Participation> + +consentItemArray: FormArray<dynamic> + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +form: FormGroup + +enrollmentTypeControlOptions: List<FormControlOption<Participation>> + +consentItemModels: List<ConsentItemFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + +canTestScreener: bool + +canTestConsent: bool + +questionTitles: Map<FormMode, String Function()> - - - <static>+GoRoute route() + + + +void setControlsFrom() + +EnrollmentFormData buildFormData() + +void read() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() + +dynamic testScreener() + +dynamic testConsent() + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() - - - - + + + + + - - - QuestionFormRouteArgs + + + EnrollmentFormConsentItemDelegate - - - +questionId: String + + + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +owner: EnrollmentFormViewModel + +propagateOnSave: bool + +validationSet: dynamic - - - - - - - - ScreenerQuestionFormRouteArgs + + + +void onCancel() + +dynamic onSave() + +ConsentItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - - + + + + - - - ConsentItemFormRouteArgs + + + ConsentItemFormView - - - +consentId: String + + + +formViewModel: ConsentItemFormViewModel - - - - + + + - - - SurveyQuestionFormRouteArgs + + + StudyUTimeOfDay - - - +questionId: String + + + + + + + + + + ScheduleControls - - - - - - - - - InterventionTaskFormRouteArgs + + + +formViewModel: WithScheduleControls - - - +taskId: String + + + +Widget build() + -List<FormTableRow> _conditionalTimeRestrictions() - - - - + + + + - - - ReportItemFormRouteArgs + + + SurveyQuestionType - - - +sectionId: String + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType - - - - + + + + + - - - RoutingIntents + + + ChoiceQuestionFormView - - - <static>+root: RoutingIntent - <static>+studies: RoutingIntent - <static>+studiesShared: RoutingIntent - <static>+publicRegistry: RoutingIntent - <static>+study: RoutingIntent Function(String) - <static>+studyEdit: RoutingIntent Function(String) - <static>+studyEditInfo: RoutingIntent Function(String) - <static>+studyEditEnrollment: RoutingIntent Function(String) - <static>+studyEditInterventions: RoutingIntent Function(String) - <static>+studyEditIntervention: RoutingIntent Function(String, String) - <static>+studyEditMeasurements: RoutingIntent Function(String) - <static>+studyEditReports: RoutingIntent Function(String) - <static>+studyEditMeasurement: RoutingIntent Function(String, String) - <static>+studyTest: RoutingIntent Function(String, {String? appRoute}) - <static>+studyRecruit: RoutingIntent Function(String) - <static>+studyMonitor: RoutingIntent Function(String) - <static>+studyAnalyze: RoutingIntent Function(String) - <static>+studySettings: RoutingIntent Function(String) - <static>+accountSettings: RoutingIntent - <static>+studyNew: RoutingIntent - <static>+login: RoutingIntent - <static>+signup: RoutingIntent - <static>+passwordForgot: RoutingIntent - <static>+passwordForgot2: RoutingIntent Function(String) - <static>+passwordRecovery: RoutingIntent - <static>+error: RoutingIntent Function(Exception) + + + +formViewModel: QuestionFormViewModel - - - - - - - - RoutingIntent Function(String) + + + +Widget build() - - - + + + + + - - - RoutingIntent Function(String, String) + + + BoolQuestionFormView - - - - + + + +formViewModel: QuestionFormViewModel + + - - - RoutingIntent Function(String, {String? appRoute}) + + + +Widget build() - - - + + + + - - - RoutingIntent Function(Exception) + + + IScaleQuestionFormViewModel - - - - - - - - GoRoute + + + +isMidValuesClearedInfoVisible: bool - - - - + + + + - - - RoutingIntentDispatch + + + ScaleQuestionFormView - - - +index: int - <static>+values: List<RoutingIntentDispatch> - <static>+go: RoutingIntentDispatch - <static>+push: RoutingIntentDispatch + + + +formViewModel: QuestionFormViewModel - - - + + + + + - - - NullHelperDecoration + + + QuestionFormData - - - - + + + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> + +questionId: String + +questionText: String + +questionInfoText: String? + +questionType: SurveyQuestionType + +responseOptionsValidity: Map<dynamic, bool> + +responseOptions: List<dynamic> + +id: String + + - - - InputDecoration + + + +Question<dynamic> toQuestion() + +EligibilityCriterion toEligibilityCriterion() + +Answer<dynamic> constructAnswerFor() + +dynamic setResponseOptionsValidityFrom() + +QuestionFormData copy() - - - - + + + + + - - - MouseEventsRegion + + + ChoiceQuestionFormData - - - +onTap: void Function()? - +onHover: void Function(PointerHoverEvent)? - +onEnter: void Function(PointerEnterEvent)? - +onExit: void Function(PointerExitEvent)? - +autoselectCursor: bool - +cursor: SystemMouseCursor - <static>+defaultCursor: SystemMouseCursor - +autoCursor: SystemMouseCursor + + + +isMultipleChoice: bool + +answerOptions: List<String> + +responseOptions: List<String> - - - - - - - - void Function(PointerHoverEvent)? + + + +Question<dynamic> toQuestion() + +QuestionFormData copy() + -Choice _buildChoiceForValue() + +Answer<dynamic> constructAnswerFor() - - - + + + + + - - - void Function(PointerEnterEvent)? + + + BoolQuestionFormData - - - - + + + <static>+kResponseOptions: Map<String, bool> + +responseOptions: List<String> + + - - - void Function(PointerExitEvent)? + + + +Question<dynamic> toQuestion() + +BoolQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - + + + + + - - - SystemMouseCursor + + + ScaleQuestionFormData - - - - - - + + + +minValue: double + +maxValue: double + +minLabel: String? + +maxLabel: String? + +midValues: List<double?> + +midLabels: List<String?> + +stepSize: double + +initialValue: double? + +minColor: Color? + +maxColor: Color? + +responseOptions: List<double> + +midAnnotations: List<Annotation> + + - - - ActionMenuInline + + + +ScaleQuestion toQuestion() + +QuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - +actions: List<ModelAction<dynamic>> - +iconSize: double? - +visible: bool - +splashRadius: double? - +paddingVertical: double? - +paddingHorizontal: double? + + + + + + + + + SurveyQuestionFormView - - - +Widget build() + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool - - - - - + + + + + - - - IconPack + + + StudyFormViewModel - - - <static>+defaultPack: List<IconOption> - <static>+material: List<IconOption> + + + +studyDirtyCopy: Study? + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +router: GoRouter + +studyInfoFormViewModel: StudyInfoFormViewModel + +enrollmentFormViewModel: EnrollmentFormViewModel + +measurementsFormViewModel: MeasurementsFormViewModel + +reportsFormViewModel: ReportsFormViewModel + +interventionsFormViewModel: InterventionsFormViewModel + +form: FormGroup + +isStudyReadonly: bool + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> - - - <static>+IconOption? resolveIconByName() + + + +void read() + +void setControlsFrom() + +Study buildFormData() + +void dispose() + +void onCancel() + +dynamic onSave() + -dynamic _applyAndSaveSubform() - - - - - + + + + + - - - IconOption + + + InterventionsFormViewModel - - - +name: String - +icon: IconData? - +isEmpty: bool - +props: List<Object?> + + + +study: Study + +router: GoRouter + +interventionsArray: FormArray<dynamic> + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> + +form: FormGroup + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +interventionsRequired: dynamic + +titles: Map<FormMode, String> + +canTestStudySchedule: bool - - - +String toJson() - <static>+IconOption fromJson() + + + +void setControlsFrom() + +InterventionsFormData buildFormData() + +void read() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +InterventionFormViewModel provide() + +void onCancel() + +dynamic onSave() + +dynamic testStudySchedule() - - - + + + + + - - - ReactiveIconPicker + + + StudyScheduleControls - - - - - - - - ReactiveFocusableFormField + + + <static>+defaultScheduleType: PhaseSequence + <static>+defaultScheduleTypeSequence: String + <static>+defaultNumCycles: int + <static>+defaultPeriodLength: int + +sequenceTypeControl: FormControl<PhaseSequence> + +sequenceTypeCustomControl: FormControl<String> + +phaseDurationControl: FormControl<int> + +numCyclesControl: FormControl<int> + +includeBaselineControl: FormControl<bool> + +studyScheduleControls: Map<String, FormControl<Object>> + <static>+kNumCyclesMin: int + <static>+kNumCyclesMax: int + <static>+kPhaseDurationMin: int + <static>+kPhaseDurationMax: int + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +numCyclesRange: dynamic + +phaseDurationRange: dynamic + +customSequenceRequired: dynamic - - - - - - - - - - IconPicker + + + +void setStudyScheduleControlsFrom() + +StudyScheduleFormData buildStudyScheduleFormData() + +bool isSequencingCustom() - - - +iconOptions: List<IconOption> - +selectedOption: IconOption? - +onSelect: void Function(IconOption)? - +galleryIconSize: double? - +selectedIconSize: double? - +focusNode: FocusNode? - +isDisabled: bool - - + + + + - - - +Widget build() + + + PhaseSequence - - - + + + + - - - void Function(IconOption)? + + + StudyDesignInterventionsFormView - - - - - - - - FocusNode + + + +Widget build() - - - - - + + + + + - - - IconPickerField + + + InterventionFormViewModel - - - +iconOptions: List<IconOption> - +selectedOption: IconOption? - +selectedIconSize: double? - +galleryIconSize: double? - +onSelect: void Function(IconOption)? - +focusNode: FocusNode? - +isDisabled: bool + + + +study: Study + +interventionIdControl: FormControl<String> + +interventionTitleControl: FormControl<String> + +interventionIconControl: FormControl<IconOption> + +interventionDescriptionControl: FormControl<String> + +interventionTasksArray: FormArray<dynamic> + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> + +form: FormGroup + +interventionId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneTask: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - +Widget build() + + + +void setControlsFrom() + +InterventionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +void onCancel() + +dynamic onSave() + +InterventionTaskFormViewModel provide() + +InterventionTaskFormRouteArgs buildNewFormRouteArgs() + +InterventionTaskFormRouteArgs buildFormRouteArgs() + +InterventionFormViewModel createDuplicate() - - - - - + + + + + - - - IconPickerGallery + + + StudyScheduleFormView - - - +iconOptions: List<IconOption> - +onSelect: void Function(IconOption)? - +iconSize: double + + + +formViewModel: StudyScheduleControls - - - +Widget build() + + + -FormTableRow _renderCustomSequence() + +Widget build() - - - - - - - - BannerBox - - + + + + + - - - +prefixIcon: Widget? - +body: Widget - +style: BannerStyle - +padding: EdgeInsets? - +noPrefix: bool - +dismissable: bool - +isDismissed: bool? - +onDismissed: dynamic Function()? - +dismissIconSize: double + + + StudyScheduleFormData - - - - - - - - - BannerStyle + + + +sequenceType: PhaseSequence + +sequenceTypeCustom: String + +numCycles: int + +phaseDuration: int + +includeBaseline: bool + +id: String - - - +index: int - <static>+values: List<BannerStyle> - <static>+warning: BannerStyle - <static>+info: BannerStyle - <static>+error: BannerStyle + + + +StudySchedule toStudySchedule() + +Study apply() + +StudyScheduleFormData copy() - - - + + + + - - - dynamic Function()? + + + InterventionFormView - - - - - - - - - - Badge + + + +formViewModel: InterventionFormViewModel - - - +icon: IconData? - +color: Color? - +borderRadius: double - +label: String - +type: BadgeType - +padding: EdgeInsets - +iconSize: double? - +labelStyle: TextStyle? + + + + + + + + + + InterventionTaskFormData - - - +Widget build() - -Color? _getBackgroundColor() - -Color _getBorderColor() - -Color? _getLabelColor() + + + +taskId: String + +taskTitle: String + +taskDescription: String? + <static>+kDefaultTitle: String + +id: String - - - - - - - - TextStyle + + + +CheckmarkTask toTask() + +InterventionTaskFormData copy() - - - - - - - - - ConstrainedWidthFlexible - - + + + + + - - - +minWidth: double - +maxWidth: double - +flex: int - +flexSum: int - +child: Widget - +outerConstraints: BoxConstraints + + + InterventionPreview - - - +Widget build() - -double _getWidth() + + + +routeArgs: InterventionFormRouteArgs + + + + + + +Widget build() - - - + + + + - - - BoxConstraints + + + InterventionTaskFormView + + + + + + +formViewModel: InterventionTaskFormViewModel - - - - - + + + + + - - - SecondaryButton + + + InterventionTaskFormViewModel - - - +text: String - +icon: IconData? - +isLoading: bool - +onPressed: void Function()? + + + +taskIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +taskTitleControl: FormControl<String> + +taskDescriptionControl: FormControl<String> + +markAsCompletedControl: FormControl<bool> + +form: FormGroup + +taskId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +titles: Map<FormMode, String> - - - +Widget build() + + + +void setControlsFrom() + +InterventionTaskFormData buildFormData() + +InterventionTaskFormViewModel createDuplicate() - - - - - + + + + + - - - HtmlStylingBanner + + + InterventionsFormData - - - +isDismissed: bool - +onDismissed: dynamic Function()? + + + +interventionsData: List<InterventionFormData> + +studyScheduleData: StudyScheduleFormData + +id: String - - - +Widget build() + + + +Study apply() + +InterventionsFormData copy() - - - - + + + + + - - - TabbedNavbar + + + InterventionFormData - - - +tabs: List<T> - +selectedTab: T? - +indicator: BoxDecoration? - +height: double? - +disabledBackgroundColor: Color? - +disabledTooltipText: String? - +onSelect: void Function(int, T)? - +labelPadding: EdgeInsets? - +labelSpacing: double? - +indicatorSize: TabBarIndicatorSize? - +isScrollable: bool - +backgroundColor: Color? - +labelColorHover: Color? - +unselectedLabelColorHover: Color? + + + +interventionId: String + +title: String + +description: String? + +tasksData: List<InterventionTaskFormData>? + +iconName: String? + <static>+kDefaultTitle: String + +id: String - - - - - - - - BoxDecoration + + + +Intervention toIntervention() + +InterventionFormData copy() - - - + + + + - - - void Function(int, T)? + + + AccountSettingsDialog - - - - - - - - TabBarIndicatorSize + + + +Widget build() - - - - + + + + - - - ActionMenuType + + + AppStatus - - - +index: int - <static>+values: List<ActionMenuType> - <static>+inline: ActionMenuType - <static>+popup: ActionMenuType + + + +index: int + <static>+values: List<AppStatus> + <static>+initializing: AppStatus + <static>+initialized: AppStatus - - - - + + + + + - - - FormScaffold + + + AppController - - - +formViewModel: T - +actions: List<Widget>? - +body: Widget - +drawer: Widget? - +actionsSpacing: double - +actionsPadding: double + + + +sharedPreferences: SharedPreferences + +appDelegates: List<IAppDelegate> + -_delayedFuture: dynamic + +isInitialized: dynamic + + + + + + +dynamic onAppStart() + -dynamic _callDelegates() - - - - + + + + + - - - PrimaryButton + + + CombinedStreamNotifier - - - +text: String - +icon: IconData? - +isLoading: bool - +showLoadingEarliestAfterMs: int - +onPressed: void Function()? - +tooltip: String - +tooltipDisabled: String - +enabled: bool - +onPressedFuture: dynamic Function()? - +innerPadding: EdgeInsets - +minimumSize: Size? - +isDisabled: bool + + + -_subscriptions: List<StreamSubscription<dynamic>> + + + + + + +void dispose() - - - + + + - - - Size + + + ChangeNotifier - - - - - + + + + + - - - SingleColumnLayout + + + Tuple - - - <static>+defaultConstraints: BoxConstraints - <static>+defaultConstraintsNarrow: BoxConstraints - +body: Widget - +header: Widget? - +stickyHeader: bool - +constraints: BoxConstraints? - +scroll: bool - +padding: EdgeInsets? + + + +first: T1 + +second: T2 + +props: List<Object?> - - - <static>+dynamic fromType() + + + +Map<String, dynamic> toJson() + <static>+Tuple<dynamic, dynamic> fromJson() + +Tuple<T1, T2> copy() + +Tuple<T1, T2> copyWith() - - - - + + + + + - - - FormTableRow + + + OptimisticUpdate + + + + + + +applyOptimistic: void Function() + +apply: dynamic Function() + +rollback: void Function() + +onUpdate: void Function()? + +onError: void Function(Object, StackTrace?)? + +rethrowErrors: bool + +runOptimistically: bool + +completeFutureOptimistically: bool - - - +label: String? - +labelBuilder: Widget Function(BuildContext)? - +labelStyle: TextStyle? - +labelHelpText: String? - +input: Widget - +control: AbstractControl<dynamic>? - +layout: FormTableRowLayout? + + + +dynamic execute() + -void _runUpdateHandlerIfAny() - - - + + + - - - Widget Function(BuildContext)? + + + void Function() - - - - - - - - FormTableRowLayout - - + + + - - - +index: int - <static>+values: List<FormTableRowLayout> - <static>+vertical: FormTableRowLayout - <static>+horizontal: FormTableRowLayout + + + void Function(Object, StackTrace?)? - - - - - + + + + + - - - FormTableLayout + + + ExecutionLimiter - - - +rows: List<FormTableRow> - +columnWidths: Map<int, TableColumnWidth> - +rowDivider: Widget? - +rowLayout: FormTableRowLayout? - +rowLabelStyle: TextStyle? + + + +milliseconds: int + <static>-_timer: Timer? - - - +Widget build() + + + +void dispose() - - - - - + + + - - - FormSectionHeader + + + Timer - - - +title: String - +titleTextStyle: TextStyle? - +helpText: String? - +divider: bool - +helpTextDisabled: bool + + + + + + + + + Throttler - - - +Widget build() + + + +dynamic call() - - - - - - - - - FormLabel - - + + + + - - - +labelText: String? - +helpText: String? - +labelTextStyle: TextStyle? - +layout: FormTableRowLayout? + + + FileFormatEncoder - - - +Widget build() + + + +dynamic encodeAsync() + +String encode() + +dynamic call() - - - - + + + + - - - FormSideSheetTab + + + CSVStringEncoder - - - +formViewBuilder: Widget Function(T) + + + +String encode() - - - - + + + + - - - SidesheetTab + + + JsonStringEncoder - - - +builder: Widget Function(BuildContext) + + + +String encode() - - - - + + + + + - - - Sidesheet + + + CountWhereValidator - - - <static>+kDefaultWidth: double - +titleText: String - +body: Widget? - +tabs: List<SidesheetTab>? - +actionButtons: List<Widget>? - +width: double? - +withCloseButton: bool - +ignoreAppBar: bool - +collapseSingleTab: bool - +bodyPadding: EdgeInsets? - +wrapContent: Widget Function(Widget)? + + + +predicate: bool Function(T?) + +minCount: int? + +maxCount: int? + <static>+kValidationMessageMinCount: String + <static>+kValidationMessageMaxCount: String - - - - - - - - Widget Function(Widget)? + + + +Map<String, dynamic>? validate() - - - - + + + - - - UnderConstruction + + + bool Function(T?) - - - +Widget build() + + + + + + + + Validator - - - - - + + + + + - - - DismissButton + + + MustMatchValidator - - - +onPressed: void Function()? - +text: String? + + + +control: AbstractControl<dynamic>? + +matchingControl: AbstractControl<dynamic>? - - - +Widget build() + + + +Map<String, dynamic>? validate() - - - - + + + + - - - TwoColumnLayout + + + FieldValidators - - - <static>+defaultDivider: VerticalDivider - <static>+defaultContentPadding: EdgeInsets - <static>+slimContentPadding: EdgeInsets - +leftWidget: Widget - +rightWidget: Widget - +dividerWidget: Widget? - +headerWidget: Widget? - +flexLeft: int? - +flexRight: int? - +constraintsLeft: BoxConstraints? - +constraintsRight: BoxConstraints? - +scrollLeft: bool - +scrollRight: bool - +paddingLeft: EdgeInsets? - +paddingRight: EdgeInsets? - +backgroundColorLeft: Color? - +backgroundColorRight: Color? - +stretchHeight: bool + + + <static>+String? emailValidator() - - - + + + + - - - VerticalDivider + + + Patterns + + + + + + <static>+timeFormatString: String + <static>+emailFormatString: String + <static>+url: String - - - - - + + + + - - - ErrorPage + + + Time + + + + + + <static>+dynamic fromTimeOfDay() + +Map<String, dynamic> toJson() + <static>+Time fromJson() - - - +error: Exception? - - + + + + - - - +Widget build() + + + TimeOfDay - - - - + + + + - - - SplashPage + + + TimeValueAccessor - - - +Widget build() + + + +String modelToViewValue() + +Time? viewToModelValue() + -String _addLeadingZeroIfNeeded() - - - - - - - - Hyperlink - - + + + - - - +text: String - +url: String? - +onClick: void Function()? - +linkColor: Color - +hoverColor: Color? - +visitedColor: Color? - +style: TextStyle? - +hoverStyle: TextStyle? - +visitedStyle: TextStyle? - +icon: IconData? - +iconSize: double? + + + ControlValueAccessor - - - - - + + + + + - - - StandardDialog + + + NumericalRangeFormatter - - - +title: Widget? - +titleText: String? - +body: Widget - +actionButtons: List<Widget> - +backgroundColor: Color? - +borderRadius: double? - +width: double? - +height: double? - +minWidth: double - +minHeight: double - +maxWidth: double? - +maxHeight: double? - +padding: EdgeInsets + + + +min: int? + +max: int? - - - +Widget build() + + + +TextEditingValue formatEditUpdate() - - - - - + + + - - - StudyULogo + + + TextInputFormatter - - - +onTap: void Function()? + + + + + + + + + StudySequenceFormatter - - - +Widget build() + + + +TextEditingValue formatEditUpdate() - - - - - + + + + + - - - HelpIcon + + + JsonFileLoader - - - +tooltipText: String? + + + +jsonAssetsPath: String - - - +Widget build() + + + +dynamic loadJson() + +dynamic parseJsonMapFromAssets() + +dynamic parseJsonListFromAssets() - - - - - - - - - EmptyBody - - + + + + - - - +icon: IconData? - +leading: Widget? - +leadingSpacing: double? - +title: String? - +description: String? - +button: Widget? + + + ModelAction - - - +Widget build() + + + +type: T + +label: String + +icon: IconData? + +onExecute: Function + +isAvailable: bool + +isDestructive: bool - - - + + + + - - - ReactiveCustomColorPicker + + + ModelActionType - - - - - - - - ReactiveFormField + + + +index: int + <static>+values: List<ModelActionType> + <static>+edit: ModelActionType + <static>+delete: ModelActionType + <static>+remove: ModelActionType + <static>+duplicate: ModelActionType + <static>+clipboard: ModelActionType + <static>+primary: ModelActionType - - - - - + + + + + - - - TextParagraph + + + SuppressedBehaviorSubject - - - +text: String? - +style: TextStyle? - +selectable: bool - +span: List<TextSpan>? + + + +subject: BehaviorSubject<T> + +didSuppressInitialEvent: bool + -_controller: StreamController<T> - - - +Widget build() + + + -StreamController<T> _buildDerivedController() + +dynamic close() - - - - - + + + - - - FormControlLabel + + + StreamController - - - +formControl: AbstractControl<dynamic> - +text: String - +isClickable: bool - +textStyle: TextStyle? - +onClick: void Function(AbstractControl<dynamic>)? - - + + + + + - - - +Widget build() + + + SerializableColor - - - - - - - - void Function(AbstractControl<dynamic>)? + + + +Map<String, dynamic> toJson() + <static>+SerializableColor fromJson() - - - - + + + + + - - - StandardTableColumn + + + StudyUException - - - +label: String - +tooltip: String? - +columnWidth: TableColumnWidth + + + +message: String - - - - - - - - TableColumnWidth + + + +String toString() - - - - + + + + - - - StandardTable + + + DropdownMenuItemTheme - - - +items: List<T> - +columns: List<StandardTableColumn> - +onSelectItem: void Function(T) - +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)? - +trailingActionsMenuType: ActionMenuType? - +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? - +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? - +trailingActionsColumn: StandardTableColumn - +tableWrapper: Widget Function(Widget)? - +cellSpacing: double - +rowSpacing: double - +minRowHeight: double? - +showTableHeader: bool - +hideLeadingTrailingWhenEmpty: bool - +leadingWidget: Widget? - +trailingWidget: Widget? - +leadingWidgetSpacing: double? - +trailingWidgetSpacing: double? - +emptyWidget: Widget? - +rowStyle: StandardTableStyle - +disableRowInteractions: bool + + + +iconTheme: IconThemeData? - - - + + + - - - List<ModelAction<dynamic>> Function(T, int)? + + + IconThemeData - - - + + + - - - TableRow Function(BuildContext, List<StandardTableColumn>)? + + + Diagnosticable - - - - + + + + + - - - StandardTableStyle + + + ThemeConfig - - - +index: int - <static>+values: List<StandardTableStyle> - <static>+plain: StandardTableStyle - <static>+material: StandardTableStyle + + + <static>+kMinContentWidth: double + <static>+kMaxContentWidth: double + <static>+kHoverFadeFactor: double + <static>+kMuteFadeFactor: double + + + + + + <static>+dynamic bodyBackgroundColor() + <static>+Color modalBarrierColor() + <static>+Color containerColor() + <static>+Color colorPickerInitialColor() + <static>+TextStyle bodyTextMuted() + <static>+TextStyle bodyTextBackground() + <static>+double iconSplashRadius() + <static>+Color sidesheetBackgroundColor() + <static>+InputDecorationTheme dropdownInputDecorationTheme() + <static>+DropdownMenuItemTheme dropdownMenuItemTheme() - - - - + + + + - - - Collapsible + + + NoAnimationPageTransitionsBuilder - - - +contentBuilder: Widget Function(BuildContext, bool) - +headerBuilder: Widget Function(BuildContext, bool)? - +title: String? - +isCollapsed: bool + + + +Widget buildTransitions() - - - + + + - - - Widget Function(BuildContext, bool) + + + PageTransitionsBuilder - - - + + + + - - - Widget Function(BuildContext, bool)? + + + WebTransitionBuilder + + + + + + +Widget buildTransitions() - - - - + + + + - - - ISyncIndicatorViewModel + + + ThemeSettingChange - - - +isDirty: bool - +lastSynced: DateTime? + + + +settings: ThemeSettings - - - - + + + + - - - SyncIndicator + + + ThemeSettings - - - +state: AsyncValue<T> - +lastSynced: DateTime? - +isDirty: bool - +animationDuration: int - +iconSize: double + + + +sourceColor: Color + +themeMode: ThemeMode - - - - - + + + - - - ActionPopUpMenuButton + + + Notification - - - +actions: List<ModelAction<dynamic>> - +triggerIconColor: Color? - +triggerIconColorHover: Color? - +triggerIconSize: double - +disableSplashEffect: bool - +hideOnEmpty: bool - +orientation: Axis - +elevation: double? - +splashRadius: double? - +enabled: bool - +position: PopupMenuPosition + + + + + + + + + + ThemeProvider - - - +Widget build() - -Widget _buildPopupMenu() + + + +settings: ValueNotifier<ThemeSettings> + +lightDynamic: ColorScheme? + +darkDynamic: ColorScheme? + +pageTransitionsTheme: PageTransitionsTheme + +shapeMedium: ShapeBorder + + + + + + +Color custom() + +Color blend() + +Color source() + +ColorScheme colors() + +CardTheme cardTheme() + +ListTileThemeData listTileTheme() + +AppBarTheme appBarTheme() + +SnackBarThemeData snackBarThemeData() + +TabBarTheme tabBarTheme() + +BottomAppBarTheme bottomAppBarTheme() + +BottomNavigationBarThemeData bottomNavigationBarTheme() + +SwitchThemeData switchTheme() + +InputDecorationTheme inputDecorationTheme() + +TextTheme textTheme() + +DividerThemeData dividerTheme() + +NavigationRailThemeData navigationRailTheme() + +DrawerThemeData drawerTheme() + +IconThemeData iconTheme() + +CheckboxThemeData checkboxTheme() + +RadioThemeData radioTheme() + +TooltipThemeData tooltipTheme() + +ThemeData light() + +ThemeData dark() + +ThemeMode themeMode() + +ThemeData theme() + <static>+ThemeProvider of() + +bool updateShouldNotify() - - - + + + - - - Axis + + + ValueNotifier - - - + + + - - - PopupMenuPosition + + + ColorScheme - - - - - + + + - - - AsyncValueWidget + + + PageTransitionsTheme - - - +value: AsyncValue<T> - +data: Widget Function(T) - +error: Widget Function(Object, StackTrace?)? - +loading: Widget Function()? - +empty: Widget Function()? + + + + + + + + ShapeBorder - - - +Widget build() - -Widget _buildDataOrEmptyWidget() - -Widget _defaultError() - -Widget _defaultLoad() + + + + + + + + InheritedWidget - - - + + + - - - Widget Function(Object, StackTrace?)? + + + ThemeMode - - - + + + + + - - - Widget Function()? + + + CustomColor + + + + + + +name: String + +color: Color + +blend: bool + + + + + + +Color value() diff --git a/docs/uml/designer_v2/lib/utils/uml.svg b/docs/uml/designer_v2/lib/utils/uml.svg index 5bf614ecf..265b70913 100644 --- a/docs/uml/designer_v2/lib/utils/uml.svg +++ b/docs/uml/designer_v2/lib/utils/uml.svg @@ -1,5 +1,98 @@ - - [CountWhereValidator + + [CombinedStreamNotifier + | + -_subscriptions: List<StreamSubscription<dynamic>> + | + +void dispose() + ] + + [ChangeNotifier]<:-[CombinedStreamNotifier] + + [Tuple + | + +first: T1; + +second: T2; + +props: List<Object?> + | + +Map<String, dynamic> toJson(); + <static>+Tuple<dynamic, dynamic> fromJson(); + +Tuple<T1, T2> copy(); + +Tuple<T1, T2> copyWith() + ] + + [<abstract>Equatable]<:-[Tuple] + + [OptimisticUpdate + | + +applyOptimistic: void Function(); + +apply: dynamic Function(); + +rollback: void Function(); + +onUpdate: void Function()?; + +onError: void Function(Object, StackTrace?)?; + +rethrowErrors: bool; + +runOptimistically: bool; + +completeFutureOptimistically: bool + | + +dynamic execute(); + -void _runUpdateHandlerIfAny() + ] + + [OptimisticUpdate]o-[void Function()] + [OptimisticUpdate]o-[dynamic Function()] + [OptimisticUpdate]o-[void Function()?] + [OptimisticUpdate]o-[void Function(Object, StackTrace?)?] + + [<abstract>ExecutionLimiter + | + +milliseconds: int; + <static>-_timer: Timer? + | + +void dispose() + ] + + [<abstract>ExecutionLimiter]o-[Timer] + + [Debouncer + | + +leading: bool; + +cancelUncompleted: bool; + -_uncompletedFutureOperation: CancelableOperation<dynamic>? + | + +dynamic call() + ] + + [Debouncer]o-[CancelableOperation] + [<abstract>ExecutionLimiter]<:-[Debouncer] + + [Throttler + | + +dynamic call() + ] + + [<abstract>ExecutionLimiter]<:-[Throttler] + + [<abstract>FileFormatEncoder + | + +dynamic encodeAsync(); + +String encode(); + +dynamic call() + ] + + [CSVStringEncoder + | + +String encode() + ] + + [<abstract>FileFormatEncoder]<:-[CSVStringEncoder] + + [JsonStringEncoder + | + +String encode() + ] + + [<abstract>FileFormatEncoder]<:-[JsonStringEncoder] + + [CountWhereValidator | +predicate: bool Function(T?); +minCount: int?; @@ -54,14 +147,36 @@ [<abstract>ControlValueAccessor]<:-[TimeValueAccessor] - [CombinedStreamNotifier + [NumericalRangeFormatter | - -_subscriptions: List<StreamSubscription<dynamic>> + +min: int?; + +max: int? | - +void dispose() + +TextEditingValue formatEditUpdate() ] - [ChangeNotifier]<:-[CombinedStreamNotifier] + [<abstract>TextInputFormatter]<:-[NumericalRangeFormatter] + + [StudySequenceFormatter + | + +TextEditingValue formatEditUpdate() + ] + + [<abstract>TextInputFormatter]<:-[StudySequenceFormatter] + + [<abstract>IProviderArgsResolver + | + +R provide() + ] + + [<abstract>JsonFileLoader + | + +jsonAssetsPath: String + | + +dynamic loadJson(); + +dynamic parseJsonMapFromAssets(); + +dynamic parseJsonListFromAssets() + ] [ModelAction | @@ -103,108 +218,6 @@ [ModelActionType]o-[ModelActionType] [Enum]<:--[ModelActionType] - [StudyUException - | - +message: String - | - +String toString() - ] - - [Exception]<:--[StudyUException] - - [<abstract>ExecutionLimiter - | - +milliseconds: int; - <static>-_timer: Timer? - | - +void dispose() - ] - - [<abstract>ExecutionLimiter]o-[Timer] - - [Debouncer - | - +leading: bool; - +cancelUncompleted: bool; - -_uncompletedFutureOperation: CancelableOperation<dynamic>? - | - +dynamic call() - ] - - [Debouncer]o-[CancelableOperation] - [<abstract>ExecutionLimiter]<:-[Debouncer] - - [Throttler - | - +dynamic call() - ] - - [<abstract>ExecutionLimiter]<:-[Throttler] - - [<abstract>JsonFileLoader - | - +jsonAssetsPath: String - | - +dynamic loadJson(); - +dynamic parseJsonMapFromAssets(); - +dynamic parseJsonListFromAssets() - ] - - [<abstract>FileFormatEncoder - | - +dynamic encodeAsync(); - +String encode(); - +dynamic call() - ] - - [CSVStringEncoder - | - +String encode() - ] - - [<abstract>FileFormatEncoder]<:-[CSVStringEncoder] - - [JsonStringEncoder - | - +String encode() - ] - - [<abstract>FileFormatEncoder]<:-[JsonStringEncoder] - - [OptimisticUpdate - | - +applyOptimistic: void Function(); - +apply: dynamic Function(); - +rollback: void Function(); - +onUpdate: void Function()?; - +onError: void Function(Object, StackTrace?)?; - +rethrowErrors: bool; - +runOptimistically: bool; - +completeFutureOptimistically: bool - | - +dynamic execute(); - -void _runUpdateHandlerIfAny() - ] - - [OptimisticUpdate]o-[void Function()] - [OptimisticUpdate]o-[dynamic Function()] - [OptimisticUpdate]o-[void Function()?] - [OptimisticUpdate]o-[void Function(Object, StackTrace?)?] - - [Tuple - | - +first: T1; - +second: T2; - +props: List<Object?> - | - +Map<String, dynamic> toJson(); - <static>+Tuple<dynamic, dynamic> fromJson(); - +Tuple<T1, T2> copy(); - +Tuple<T1, T2> copyWith() - ] - - [<abstract>Equatable]<:-[Tuple] - [SuppressedBehaviorSubject | +subject: BehaviorSubject<T>; @@ -218,23 +231,6 @@ [SuppressedBehaviorSubject]o-[BehaviorSubject] [SuppressedBehaviorSubject]o-[StreamController] - [NumericalRangeFormatter - | - +min: int?; - +max: int? - | - +TextEditingValue formatEditUpdate() - ] - - [<abstract>TextInputFormatter]<:-[NumericalRangeFormatter] - - [StudySequenceFormatter - | - +TextEditingValue formatEditUpdate() - ] - - [<abstract>TextInputFormatter]<:-[StudySequenceFormatter] - [SerializableColor | +Map<String, dynamic> toJson(); @@ -243,116 +239,423 @@ [Color]<:-[SerializableColor] - [<abstract>IProviderArgsResolver + [StudyUException | - +R provide() + +message: String + | + +String toString() ] + [Exception]<:--[StudyUException] + - + - + - + + + + + - + - - - + - + - - - - - - - - - + - + - - - + - + - - + + + - - - + + + + + + + + + + + + + + + - - + + + - + - + + + + + + + + + + + - + + + + + + + + + + - - - - - - - - - + + - + + + + + + + + + + + + + + + + + + + + + CombinedStreamNotifier + + + + + + -_subscriptions: List<StreamSubscription<dynamic>> + + + + + + +void dispose() + + + + + + + + + + + ChangeNotifier + + + + + + + + + + + + + Tuple + + + + + + +first: T1 + +second: T2 + +props: List<Object?> + + + + + + +Map<String, dynamic> toJson() + <static>+Tuple<dynamic, dynamic> fromJson() + +Tuple<T1, T2> copy() + +Tuple<T1, T2> copyWith() + + + + + + + + + + + Equatable + + + + + + + + + + + + + OptimisticUpdate + + + + + + +applyOptimistic: void Function() + +apply: dynamic Function() + +rollback: void Function() + +onUpdate: void Function()? + +onError: void Function(Object, StackTrace?)? + +rethrowErrors: bool + +runOptimistically: bool + +completeFutureOptimistically: bool + + + + + + +dynamic execute() + -void _runUpdateHandlerIfAny() + + + + + + + + + + + void Function() + + + + + + + + + + + dynamic Function() + + + + + + + + + + + void Function()? + + + + + + + + + + + void Function(Object, StackTrace?)? + + + + + + + + + + + + + ExecutionLimiter + + + + + + +milliseconds: int + <static>-_timer: Timer? + + + + + + +void dispose() + + + + + + + + + + + Timer + + + + + + + + + + + + + Debouncer + + + + + + +leading: bool + +cancelUncompleted: bool + -_uncompletedFutureOperation: CancelableOperation<dynamic>? + + + + + + +dynamic call() + + + - - - + + + + + + + CancelableOperation + + + - - - + + + + + + + + Throttler + + + + + + +dynamic call() + + + - - - + + + + + + + + FileFormatEncoder + + + + + + +dynamic encodeAsync() + +String encode() + +dynamic call() + + + - - - - - + + + + + + + + CSVStringEncoder + + + + + + +String encode() + + + - - - + + + + + + + + JsonStringEncoder + + + + + + +String encode() + + + - - - - - - - - - + + + - + CountWhereValidator - + +predicate: bool Function(T?) +minCount: int? @@ -362,7 +665,7 @@ - + +Map<String, dynamic>? validate() @@ -371,9 +674,9 @@ - + - + bool Function(T?) @@ -382,9 +685,9 @@ - + - + Validator @@ -393,24 +696,24 @@ - - - + + + - + MustMatchValidator - + +control: AbstractControl<dynamic>? +matchingControl: AbstractControl<dynamic>? - + +Map<String, dynamic>? validate() @@ -419,9 +722,9 @@ - + - + AbstractControl @@ -430,16 +733,16 @@ - - + + - + FieldValidators - + <static>+String? emailValidator() @@ -448,16 +751,16 @@ - - + + - + Patterns - + <static>+timeFormatString: String <static>+emailFormatString: String @@ -468,16 +771,16 @@ - - + + - + Time - + <static>+dynamic fromTimeOfDay() +Map<String, dynamic> toJson() @@ -488,9 +791,9 @@ - + - + TimeOfDay @@ -499,16 +802,16 @@ - - + + - + TimeValueAccessor - + +String modelToViewValue() +Time? viewToModelValue() @@ -519,306 +822,107 @@ - + - + ControlValueAccessor - - - - - - - - - CombinedStreamNotifier - - - - - - -_subscriptions: List<StreamSubscription<dynamic>> - - - - - - +void dispose() - - - - - - - - - - - ChangeNotifier - - - - - - - - - - - - ModelAction - - - - - - +type: T - +label: String - +icon: IconData? - +onExecute: Function - +isAvailable: bool - +isDestructive: bool - - - - - - - - - - - IconData - - - - - - - - - - - - IModelActionProvider - - - - - - +List<ModelAction<dynamic>> availableActions() - - - - - - - - - - - - IListActionProvider - - - - - - +void onSelectItem() - +void onNewItem() - - - - - - - - - - - - ModelActionType - - - - - - +index: int - <static>+values: List<ModelActionType> - <static>+edit: ModelActionType - <static>+delete: ModelActionType - <static>+remove: ModelActionType - <static>+duplicate: ModelActionType - <static>+clipboard: ModelActionType - <static>+primary: ModelActionType - - - - - - - - - - - Enum - - - - - - - - - - - - - StudyUException - - - - - - +message: String - - - - - - +String toString() - - - - - - - - - - - Exception - - - - - - - - - - - - - ExecutionLimiter - - - - - - +milliseconds: int - <static>-_timer: Timer? - - - - - - +void dispose() - - - - - - - + + + + + - - - Timer + + + NumericalRangeFormatter - - - - - - - - - - Debouncer + + + +min: int? + +max: int? - - - +leading: bool - +cancelUncompleted: bool - -_uncompletedFutureOperation: CancelableOperation<dynamic>? + + + +TextEditingValue formatEditUpdate() - - - +dynamic call() + + + + + + + + TextInputFormatter - - - + + + + - - - CancelableOperation + + + StudySequenceFormatter + + + + + + +TextEditingValue formatEditUpdate() - - - - + + + + - - - Throttler + + + IProviderArgsResolver - - - +dynamic call() + + + +R provide() - - - + + + - + JsonFileLoader - + +jsonAssetsPath: String - + +dynamic loadJson() +dynamic parseJsonMapFromAssets() @@ -827,193 +931,126 @@ - - - - - - - - FileFormatEncoder - - - - - - +dynamic encodeAsync() - +String encode() - +dynamic call() - - - - - - - - - - - - CSVStringEncoder - - - - - - +String encode() - - - - - - - - + + + + - - - JsonStringEncoder + + + ModelAction - - - +String encode() + + + +type: T + +label: String + +icon: IconData? + +onExecute: Function + +isAvailable: bool + +isDestructive: bool - - - - - - - - - OptimisticUpdate - - - - - - +applyOptimistic: void Function() - +apply: dynamic Function() - +rollback: void Function() - +onUpdate: void Function()? - +onError: void Function(Object, StackTrace?)? - +rethrowErrors: bool - +runOptimistically: bool - +completeFutureOptimistically: bool - - + + + - - - +dynamic execute() - -void _runUpdateHandlerIfAny() + + + IconData - - - + + + + - - - void Function() + + + IModelActionProvider - - - - - - - - dynamic Function() + + + +List<ModelAction<dynamic>> availableActions() - - - + + + + - - - void Function()? + + + IListActionProvider - - - - - - - - void Function(Object, StackTrace?)? + + + +void onSelectItem() + +void onNewItem() - - - - - - - - - Tuple - - + + + + - - - +first: T1 - +second: T2 - +props: List<Object?> + + + ModelActionType - - - +Map<String, dynamic> toJson() - <static>+Tuple<dynamic, dynamic> fromJson() - +Tuple<T1, T2> copy() - +Tuple<T1, T2> copyWith() + + + +index: int + <static>+values: List<ModelActionType> + <static>+edit: ModelActionType + <static>+delete: ModelActionType + <static>+remove: ModelActionType + <static>+duplicate: ModelActionType + <static>+clipboard: ModelActionType + <static>+primary: ModelActionType - - - + + + - - - Equatable + + + Enum - - - + + + - + SuppressedBehaviorSubject - + +subject: BehaviorSubject<T> +didSuppressInitialEvent: bool @@ -1021,7 +1058,7 @@ - + -StreamController<T> _buildDerivedController() +dynamic close() @@ -1031,9 +1068,9 @@ - + - + BehaviorSubject @@ -1042,82 +1079,27 @@ - + - + StreamController - - - - - - - - - NumericalRangeFormatter - - - - - - +min: int? - +max: int? - - - - - - +TextEditingValue formatEditUpdate() - - - - - - - - - - - TextInputFormatter - - - - - - - - - - - - StudySequenceFormatter - - - - - - +TextEditingValue formatEditUpdate() - - - - - - + + - + SerializableColor - + +Map<String, dynamic> toJson() <static>+SerializableColor fromJson() @@ -1127,29 +1109,47 @@ - + - + Color - - - - + + + + + - - - IProviderArgsResolver + + + StudyUException - - - +R provide() + + + +message: String + + + + + + +String toString() + + + + + + + + + + + Exception diff --git a/flutter_common/pubspec.lock b/flutter_common/pubspec.lock index 61f1d8a3d..ebb3a75ee 100644 --- a/flutter_common/pubspec.lock +++ b/flutter_common/pubspec.lock @@ -120,14 +120,6 @@ packages: description: flutter source: sdk version: "0.0.0" - freezed_annotation: - dependency: transitive - description: - name: freezed_annotation - sha256: "70776c4541e5cacfe45bcaf00fe79137b8c61aa34fb5765a05ce6c57fd72c6e9" - url: "https://pub.dev" - source: hosted - version: "0.14.3" functions_client: dependency: transitive description: @@ -692,14 +684,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.0" - yaml: - dependency: transitive - description: - name: yaml - sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" - url: "https://pub.dev" - source: hosted - version: "3.1.2" yet_another_json_isolate: dependency: transitive description: diff --git a/melos.yaml b/melos.yaml index bf2a9e0ea..85badf008 100644 --- a/melos.yaml +++ b/melos.yaml @@ -78,7 +78,7 @@ scripts: generate: run: | melos exec -c 1 --fail-fast -- \ - "flutter pub run build_runner build --delete-conflicting-outputs" + "dart run build_runner build --delete-conflicting-outputs" description: Generate files with build_runner packageFilters: scope: studyu_core